SQLインジェクション入門:仕組みと対策
直したことを、どう確かめるか
この回でやること
攻撃が止まっただけでは直った証明になりません。正規の利用者が今までどおり使えることを同時に見ます。名前に引用符を持つ利用者、名前にorを含む利用者が締め出されないことまで確かめます。
- 読む 約 9 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
直したことの確認は、攻撃が通らなくなったかだけでなく、正規の利用者が今までどおり使えるかまでを同時に見て初めて成り立ちます。この回は名前に癖のある o'brien と taylor を題材に、その再検証の型を同じ users テーブルで扱います。
読み終えると、攻撃を止めても正規の利用者を締め出す直し方があると分かり、合否を両面で見られるようになります。
攻撃が止まっただけでは足りない
外した直し方でも、攻撃は止まります。入力からシングルクォートを取り除く方針は、admin' -- を admin -- という別の文字列に変えるので、その名前の利用者はおらず401になります。OR や -- を含む入力を拒む方針も、' OR '1'='1' -- をその場で撥ねます。どちらも admin' -- は通らなくなります。だから攻撃だけを試すと、両方とも直ったように見えます。
ここが肝です。攻撃が止まることは、直った証明になりません。塞ぎ方が正しくても間違っていても、同じように攻撃は止まるからです。
締め出される正規の利用者を見る
差が出るのは、正規の利用者を通したときです。シングルクォートを取り除く方針は、名前に ' を持つ o'brien の名前まで obrien に書き換えます。保存されている名前と一致しなくなり、本人が正しいパスワードを入れても入れません。OR や -- を弾く方針は、名前に or を含む taylor を拒みます。taylor の綴りの中に or が入っているからです。
攻撃を止めた同じ操作が、正規の利用を壊しています。攻撃側だけを見ていると、この副作用は視界に入りません。
再検証は攻撃と正規利用を一度に流す
だから再検証は、両方をまとめて流します。章末の演習が自動で走らせる確かめ方は次のとおりです。正しい名前とパスワードで入れること、パスワードが違えば入れないこと、' OR '1'='1' -- で入れないこと、admin' -- で入れないこと、パスワード欄の ' OR '1'='1 で入れないこと、そして o'brien と taylor が今までどおり入れること。全部が緑になってはじめて修正が完了します。
プレースホルダで直すと、この全部が通ります。攻撃は名前としてしか扱われず弾かれ、o'brien も taylor も名前を書き換えられないのでそのまま一致します。シングルクォートを取り除く方針を選ぶと o'brien の行が、語を弾く方針を選ぶと taylor の行が赤くなり、攻撃は止まっているのに未完成だと分かります。
攻撃が止まるのは必要な条件で、十分ではありません。鍵を付け替えて泥棒を締め出しても、住人まで入れなくなったら直したことにはなりません。締め出したのが泥棒だけかを、正規の利用者で確かめます。
攻撃が止まったかだけを見ると、正規利用者を巻き込む直し方が合格してしまいます。合否は「攻撃が止まった」と「正規の利用が今までどおり」の両方がそろうかで決めます。片方だけでは判定になりません。
確かめるのは自分が権限を持つ練習用の環境だけにします。手を動かすなら、直したあとに攻撃を1つ送って401を見て満足せず、o'brien と taylor を続けて送り、200で入れるかまで見ます。