SQL インジェクション対策(プレースホルダほか)
更新日:
用語解説
SQLインジェクションは、外部からの入力をSQL文に不適切に組み込むことで、入力がSQLの命令として解釈され、意図しない操作をされる脆弱性です。
■ 試験で押さえるポイント
認証の回避、データの盗み出し、改ざん、削除につながります。
根本の対策は、プレースホルダ(パラメータ化した問合せ)を使い、SQL文を文字列の連結で作らないことです。
エラーの詳細を表示しない、データベースのアカウントの権限を最小にする、などの対策も重ねます。
■ 過去問での着眼点
入力をSQLに文字列として連結することが原因です。第一の対策はプレースホルダです。
例: 利用者名をプレースホルダで渡せば、記号を含む入力もSQLの命令ではなくデータとして扱われます。
■ バインドできる値と動的SQLの注意
SQLの構文を先に定め、入力値をバインド変数として渡すことで、入力が構文として解釈される経路を断つ。値を文字列連結してから実行する方式では、後で形式チェックを加えただけで十分とは限らない。
テーブル名・列名・ソート方向などの識別子や構文要素は、値と同じようにバインドできない場合がある。利用者の指定を許可された固定値へ対応付ける。ストアドプロシージャやORMも内部で入力を連結すれば脆弱になる。
DBの接続権限を必要最小限にし、修正した同じ入力経路で再検証する。WAFの遮断ログやSQLエラーがないことだけで、SQLインジェクションが存在しないとは判定しない。