フジボウルの寺山です。
最近急に寒くなりましたね!
毎年電気で暖かなる毛布には助けられております
以前に引き続きSQLインジェクションの対策についてです。
○プレスホルダーによるSQL組み立て
パラメータ部分を「?」などの記号で示しておき、後にそこへ実際の値を機械的な処理で割り当てる方法です。
機械的な処理については後述いたしますが、例えば以下のようなSQLになります。
SELECT * FROM customer WHERE id = ?
ここで、パラメータ部分を示す記号のことをプレースホルダと呼び、そこへ実際の値を割り当てることを「バインドする」と呼びます。そのため、プレースホルダのことを「バインド変数」と呼ぶこともあります。
○prepared statement
?などがついたプレースホルダのままSQL文をデータベースエンジン側にあらかじめ送信し、実行前にSQL文の構造解析などの準備をしておく方式です。
SQL実行の段階で、実際のパラメータの値をデータベース側に送信しデータベースエンジン側がバインド処理します。
静的プレースホルダでは、DB側で?の部分がすでにリテラルとして認識されるため、バインドする時の値がリテラルからはみ出さないためエスケープ処理が必要ありません。リテラルからはみ出さないということはSQL文として解釈されないということになります。
また、構文解析などを事前にしておくことで実行効率を高くするメリットもあります。
SQLインジェクション対策は以上となります。
私もまだまだ知識不足ですが、対策となぜ必要なのかを理解し、安全なWEBサイトを設計致しましょう!