第11章 高度なプログラミング / 第5回 模擬試験
PHPのクロスサイトスクリプティング(XSS)対策に関する次の記述のうち、正しいものはどれか。
ユーザー入力をHTMLとして出力する前に`htmlspecialchars()`でエスケープすることが有効な対策である。
正解
XSS対策にはプリペアドステートメントを使用するのが最も有効である。
XSSはサーバー側のデータベースを直接破壊する攻撃であり、ブラウザには影響しない。
XSS対策は、Cookieの有効期限を短くするだけで十分である。
解説
ユーザーが入力した値をHTMLとしてそのまま画面に出力すると、入力内容に`<script>`タグなどが含まれていた場合にブラウザ上で実行されてしまう危険があります(XSS)。これを防ぐ基本的な対策が、出力前に`htmlspecialchars()`で`<`, `>`, `&`, `"`などのHTML特殊文字をエスケープすることです。
他の選択肢が誤りである理由は次の通りです。
・プリペアドステートメントはSQLインジェクション対策の手法であり、XSS対策には直接関係しません。
・XSSは悪意あるスクリプトを「ブラウザ側」で実行させる攻撃です。データベースを直接破壊する攻撃ではありません(データベースを狙うのはSQLインジェクションです)。
・Cookieの有効期限を短くするだけでは、XSS自体(悪意あるスクリプトが実行されること)は防げません。エスケープ処理などの根本的な対策が必要です。
例:
```
$comment = $_POST['comment']; // ユーザー入力(信頼できない)
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8'); // 出力前に必ずエスケープ
```
(参照: 独習PHP 第4版 第11章 高度なプログラミング 11.2.1節 クロスサイトスクリプティング p.599〜602)