正しく止められたときに、何を残すか
記事は無事に登録できるようになりました。原因も分かり、書き方も直しました。
ここで、もう1つ決めたことがあります。遮断の仕組みは、切りませんでした。
選べた3つの対処と、なぜ「書き方を変える」を選んだか。そして、次に同じ症状が出たときのために何を残したかです。連載の最終回になります。
第1回:症状の切り分け/第2回:二分探索で原因を絞る/第3回:エスケープが効かなかった理由/第4回:意味を変えずに書き直す/第5回:正しく止められたときに何を残すか(この記事)
対処は3つあった
| やること | 手間 | あとで効くこと | |
|---|---|---|---|
| A | 遮断の仕組みを止める | 設定1つ | 全部の攻撃も通る |
| B | この判定だけ除外する | 設定と検証 | 同じ形の攻撃が通る |
| C | 書き方を変える | 記事ごとに手直し | 記事を書くたび制約が残る |
Aがいちばん楽です。1つ切れば全部通ります。
選ばなかった理由は単純で、通したいのは自分の要求だけだからです。切ると、自分以外の要求も同じように通ります。
Bを選ばなかった理由
Bのほうは、もう少し迷いました。引っかかっている判定を1つだけ外せば、他の防御は残ります。
やめた理由は2つです。
| 懸念 | |
|---|---|
| 1 | 外した判定が何を守っていたのかを、自分が分かっていない |
| 2 | 外した記録が設定画面にしか残らない。半年後に理由を思い出せない |
この判定が引っかかったのは、コードの断片と攻撃コードの区別がつかないからでした。区別がつかない以上、外せば本物も通ります。
そして一度外すと、それは設定の中で静かに外れたままになります。「なぜ外したか」を覚えている人がいなくなった時点で、外れていること自体が忘れられます。
Cは手間が残ります。記事を書くたびに、その形を使えない。ただ、手間が残るということは、理由が見え続けるということでもあります。
誤検知だったが、間違いではなかった
今回止められたのは、攻撃ではありません。自分の記事です。判定としては誤りでした。
ただ、判定する側の仕事としては正しいと思っています。
| 判定側から見えているもの | 実際 |
|---|---|
| 文字列を組み立てる記号の対 | サンプルコード/攻撃コード |
| 置き換えの命令と括弧 | サンプルコード/攻撃コード |
送られてくる文字列だけを見て、どちらかを判別する方法はありません。区別がつかないものを、安全な側に倒しているだけです。
倒す先を逆にすると、通してはいけないものが通ります。誤検知が出るのは、正しい側に倒している証拠でした。
残したもの
同じことが次に起きたときのために、2つ残しました。
1つめは、通った例と落ちた例の一覧です。絞り込みの途中で、たくさん試しています。その結果を捨てずに書き出しました。
| 試した形 | 結果 |
|---|---|
| 囲む記号が1つだけ | 通る |
| 囲む記号が対 | 落ちる |
| 置き換えの命令と括弧 | 落ちる |
| 他の命令と括弧 | 通る |
| 正規表現をそのまま書く | 通る |
| 配列をつなぐ命令 | 通る |
この表があると、次に落ちたときに「まずこの2つが入っていないか見る」から始められます。11回の絞り込みをやり直さずに済みます。
2つめは、手順そのものです。症状から原因に辿り着くまでの最短経路を書き出しました。
| 順番 | やること | 分かること |
|---|---|---|
| 1 | 空の下書きを作ってみる | 通れば権限の問題ではない |
| 2 | 断られたときの応答の中身を見る | CMSの形式でなければ手前で止まっている |
| 3 | 既知の2つが本文にないか探す | あれば、そこで終わり |
| 4 | 無ければ、半分ずつ切って絞る | 11回で1文字まで |
| 5 | 見つけた形を一覧に追記する | 次はもっと早い |
手順の最後に「分かったことを足す」を入れています。これが無いと、毎回同じ場所から始めることになります。
今回の11回は、この一覧が空だったから必要でした。次に同じ症状が出たら、3番目で終わる可能性が高いと思っています。
連載を通して
5回分を振り返ると、実際に手を動かしたのは第4回の書き換えだけでした。
| 回 | やっていたこと |
|---|---|
| 第1回 | 誰が断ったのかを見分ける |
| 第2回 | どこが原因かを機械的に絞る |
| 第3回 | 迂回できない理由を理解する |
| 第4回 | 直す |
| 第5回 | 次のために残す |
直す作業の前後に、確かめる作業と残す作業がありました。止められたこと自体より、止められてから何をしたかのほうが長いという構成です。
今回の学び
まず、いちばん楽な対処は、いちばん広く効いてしまうということ。遮断を切れば通りますが、通したいのは自分の要求だけでした。効く範囲が目的より広いときは、たいてい選ぶべきではありません。
次に、誤検知は、正しい側に倒している証拠だということ。区別がつかないものを危険側に倒すから、安全なものも止まります。止まらなくなったら、それは判定が甘くなったということでした。
そして、手順の最後に「分かったことを足す」を入れること。今回の11回は、記録が空だったから必要でした。足す工程を手順に含めておかないと、次も同じ場所から始めることになります。
この記事を共有する
関連記事

意味を変えずに、引っかからない形へ書き直す
サンプルコードを、説明として意味が変わらないまま書き換えました。3つのうち2つは読みやすくなり、1つは悪くなっています。連載「弾かれる」第4回。

エスケープすれば通る、が通らなかった理由
記号を番号に置き換えて送れば通ると思いました。通りませんでした。照合の前に元へ戻されているからです。通っていたら穴でした。連載「弾かれる」第3回。

どこが悪いかを、11回で突き止める — 本文を半分ずつ切る
1500文字のどこが引っかかっているか分かりません。読むのをやめて、半分ずつ切って1文字まで絞り込んだ手順です。連載「弾かれる」第2回。