第11章 高度なプログラミング / 第2回 模擬試験

PHPのSQLインジェクション対策に関する次の記述のうち、正しいものはどれか。

プリペアドステートメントを使えば、SQLインジェクションを防止できる。 正解
ユーザー入力をそのままSQL文に文字列連結しても安全である。
`mysql_query()`関数(廃止済み)は現在も推奨される安全な手段である。
SQLインジェクション対策には`htmlspecialchars()`を使えばよい。
解説
プリペアドステートメントは、SQL文の雛形とパラメータを分離してデータベースに送信するため、パラメータの値がSQL構文として解釈されることがなく、SQLインジェクションを防止できます。 他の選択肢が誤りである理由は次の通りです。 ・ユーザー入力をそのまま文字列連結してSQL文に埋め込むと、`' OR '1'='1`のような入力によって意図しないSQL文が実行される危険があり、安全ではありません。 ・`mysql_query()`はPHP 5.5で非推奨化、PHP 7.0で完全に削除された関数で、現在は使用できず推奨もされません。代わりに`mysqli`または`PDO`を使います。 ・`htmlspecialchars()`はHTML特殊文字をエスケープしてXSS(クロスサイトスクリプティング)を防ぐための関数であり、SQLインジェクション対策にはなりません。 例: ``` $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $email]); ``` (参照: 独習PHP 第4版 第11章 高度なプログラミング 11.2節 セキュリティ対策 p.599〜616)