第11章 高度なプログラミング / 第1回 模擬試験
PHPのセキュリティ対策に関する次の記述のうち、誤っているものはどれか。
クロスサイトスクリプティング(XSS)対策には、`htmlspecialchars()`関数によるエスケープ処理が有効である。
SQLインジェクション対策には、プリペアドステートメントの使用が有効である。
クロスサイトリクエストフォージェリ(CSRF)対策には、ワンタイムトークンの利用が有効である。
パストラバーサル攻撃は、ファイルアップロード機能とは無関係である。
正解
解説
本問は「誤っているものはどれか」を問うており、正解の選択肢自体が事実として誤りです。パストラバーサル(ディレクトリトラバーサル)攻撃は、ユーザーが指定したパスをサーバー側でそのまま扱う処理全般に関係し、アップロード先のパスやファイル名にユーザー入力を使う実装は典型的な攻撃対象の一つです。「無関係である」という記述は誤りです。
他の選択肢が正しい理由は次の通りです。
・`htmlspecialchars()`は`<`, `>`, `&`, `"`などをHTMLエンティティに変換し、出力時のXSSを防ぎます。ただし出力先(HTML属性/JavaScript/URLなど)に応じたエスケープの使い分けが必要です。
・プリペアドステートメント(`PDO::prepare()`など)はSQL文とパラメータを分離して送信するため、値がSQL文として解釈されずSQLインジェクションを防げます。
・CSRFトークンはリクエストが正規のフォームから送信されたことをサーバー側で検証する仕組みで、Laravelでは`@csrf`ディレクティブとミドルウェアで標準対応しています。
パストラバーサル攻撃への対策としては、アップロードファイル名をユーザー入力のまま使わずランダム生成する、`realpath()`で正規化した上で許可ディレクトリ配下かを検証する、といった実装が必要です。
(参照: 独習PHP 第4版 第11章 高度なプログラミング 11.2節 セキュリティ対策 p.599〜616)