反射型XSS(Reflected Cross-Site Scripting)は、攻撃者が作成した悪意のあるスクリプトが、ウェブアプリケーションを介してユーザーのブラウザに「反射」され、実行される攻撃です。
今回のサンプルページでは、URLパラメータ(例: ?keyword=)経由で渡された値が、サーバー側で適切に処理されずにHTMLとして出力される場合、攻撃が成立します。
ユーザーが以下のようなURLをクリックするように誘導された場合を想定します。
http://localhost:8000/reflected-xss/reflected-xss-vulnerable.php?keyword=
脆弱なページ (reflected-xss-vulnerable.php) では、URLのkeywordパラメータに含まれるが、そのまま検索結果としてHTMLに挿入されます。これにより、ユーザーのブラウザでアラートが表示されたり、Cookie情報が盗まれたり、偽のコンテンツが表示されるなど、様々な被害が発生する可能性があります。
XSS攻撃の最も基本的な対策は、ユーザーからの入力値(URLパラメータ、フォーム入力など)を信頼せず、出力時に適切なサニタイズ(無害化)を行うことです。
PHPでは、htmlspecialchars()関数がよく利用されます。この関数は、HTMLの特殊文字をHTMLエンティティに変換します。
< (小なり記号) は < に変換> (大なり記号) は > に変換& (アンパサンド) は & に変換" (ダブルクォート) は " に変換' (シングルクォート) は ' に変換これにより、 のような悪意のあるスクリプトが、ブラウザにとっては単なる文字列として認識され、実行されることがなくなります。
htmlspecialchars() の使用例
対策済みページ (reflected-xss-safe.php) では、このhtmlspecialchars()関数を適用することで、XSS攻撃から保護しています。
XSS対策は、ウェブアプリケーション開発における基本中の基本です。ユーザーからの入力値を画面に出力する際は、常にエスケープ処理を施す習慣をつけましょう。