第11章 高度なプログラミング / 第4回 模擬試験
PHPのSQLインジェクションに関する次の記述のうち、誤っているものはどれか。
SQLインジェクションは、悪意あるSQL文をアプリケーションに注入し不正な操作を行わせる攻撃である。
プリペアドステートメントを使うと、SQL文とデータが分離されるため対策になる。
ユーザー入力値をエスケープせずそのままSQL文に連結すると危険である。
SQLインジェクションはHTMLの表示にのみ影響し、データベースには一切影響しない。
正解
解説
本問は「誤っているものはどれか」を問うており、正解の選択肢自体が事実として誤りです。SQLインジェクションは、悪意あるSQL文をアプリケーション経由でデータベースに実行させてしまう攻撃で、データの不正な閲覧・改ざん・削除など、データベースそのものに直接影響を与えます。「HTMLの表示にのみ影響し、データベースには一切影響しない」という記述は誤りです。
他の選択肢が正しい理由は次の通りです。
・SQLインジェクションは、悪意あるSQL文をアプリケーションに注入し、意図しないデータベース操作を行わせる攻撃です。
・プリペアドステートメントは、SQL文の構造とデータを分離して送信するため、値がSQL構文として解釈されず、有効な対策になります。
・ユーザー入力値をエスケープせずそのままSQL文に文字列連結すると、入力値次第で任意のSQL文が実行されてしまう危険があります。
例:
```
// 危険な例(絶対に避けるべき書き方)
$sql = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
// $_GET['name'] に「' OR '1'='1」を入れられると、全件取得されてしまう
```
(参照: 独習PHP 第4版 第11章 高度なプログラミング 11.2.2節 SQLインジェクション p.603〜605)