メインコンテンツへ
セキュリティ

プレースホルダ(バインド変数)がSQLインジェクションを防ぐ理由として正しいものはどれか。

ア.入力値をすべてURLエンコードするため、特殊文字が無害化される
イ.データベースへの接続自体を暗号化するため、盗聴されても安全
ウ.バインド変数はSQLの構造とデータを分離するため、入力値がSQL命令として解釈されない正解
エ.入力値の長さを制限するため、長いSQL文が注入されてもエラーになる

解説

プレースホルダは「レストランの注文票」のようなもの。料理名(データ)の欄に「厨房に入る」(SQL命令)と書いても、それはただの文字列として扱われる。

なぜ ウ が正解か

プレースホルダを使うと、SQL文の構造(命令部分)とパラメータ(データ部分)が完全に分離される。ユーザーが入力した値はデータとしてのみ処理され、どんな文字を含んでいてもSQL命令として解釈されない。そのためSQLインジェクションが根本的に防がれる。

なぜ ア は間違いか

URLエンコードはURLの特殊文字を%XX形式に変換するもので、SQLインジェクション防御とは別の話。

なぜ イ は間違いか

DB接続の暗号化(SSL/TLS)は盗聴防止であり、SQLインジェクション防御ではない。

なぜ エ は間違いか

入力値の長さ制限はある程度の防御になるが、短い悪意あるSQL(例: ' OR 1=1 --)でもインジェクションは可能。根本的な防御ではない。

出典: AI生成問題(学習用)