SQL インジェクション対策(プレースホルダほか)

更新日:

用語解説

SQLインジェクションは、外部からの入力をSQL文に不適切に組み込むことで、入力がSQLの命令として解釈され、意図しない操作をされる脆弱性です。

■ 試験で押さえるポイント

  • 認証の回避、データの盗み出し、改ざん、削除につながります。

  • 根本の対策は、プレースホルダ(パラメータ化した問合せ)を使い、SQL文を文字列の連結で作らないことです。

  • エラーの詳細を表示しない、データベースのアカウントの権限を最小にする、などの対策も重ねます。

■ 過去問での着眼点

入力をSQLに文字列として連結することが原因です。第一の対策はプレースホルダです。

例: 利用者名をプレースホルダで渡せば、記号を含む入力もSQLの命令ではなくデータとして扱われます。

■ バインドできる値と動的SQLの注意

  • SQLの構文を先に定め、入力値をバインド変数として渡すことで、入力が構文として解釈される経路を断つ。値を文字列連結してから実行する方式では、後で形式チェックを加えただけで十分とは限らない。

  • テーブル名・列名・ソート方向などの識別子や構文要素は、値と同じようにバインドできない場合がある。利用者の指定を許可された固定値へ対応付ける。ストアドプロシージャやORMも内部で入力を連結すれば脆弱になる。

  • DBの接続権限を必要最小限にし、修正した同じ入力経路で再検証する。WAFの遮断ログやSQLエラーがないことだけで、SQLインジェクションが存在しないとは判定しない。

音声で聞く

同じ分野の用語