XSS(クロスサイトスクリプティング)の防止

PHPにおける「XSS(クロスサイトスクリプティング)」の防止は、Webアプリケーションのセキュリティ対策において非常に重要です。以下に、XSSの概要とその防止策について詳しく説明します。


XSS(クロスサイトスクリプティング)とは

XSS(Cross-Site Scripting)は、悪意のあるスクリプトをWebページに埋め込み、他のユーザーのブラウザ上でそのスクリプトを実行させる攻撃手法です。主にJavaScriptが使われ、以下のような被害が発生する可能性があります。

  • ユーザーのCookieやセッション情報の盗難

  • フィッシング詐欺の誘導

  • 偽のフォームによる情報の詐取


XSSが発生する典型例(PHP)

php
// ユーザーの入力をそのままHTMLに出力 $username = $_GET['username']; echo "<p>ようこそ、$username さん!</p>";

このコードに ?username=<script>alert('XSS');</script> のようなパラメータが与えられると、JavaScriptが実行されてしまいます。


XSSの防止方法(PHP)

1. htmlspecialchars() を使用する

ユーザーからの入力をHTMLに埋め込む前に、HTMLエスケープを行います。

php
$username = $_GET['username']; $safe_username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); echo "<p>ようこそ、{$safe_username} さん!</p>";
  • ENT_QUOTES を指定するとシングル・ダブルクォート両方をエスケープ

  • UTF-8 を指定することで文字コードの問題を防止

2. テンプレートエンジンの利用

TwigやBladeなどのテンプレートエンジンは、デフォルトで自動エスケープを行うため、XSSのリスクを減らすことができます。

例(Twig):

twig
<p>ようこそ、{{ username }} さん!</p>

3. JavaScriptやHTML属性内の出力にも注意

以下のようにJavaScriptやHTML属性内で出力する場合は、より慎重なエスケープが必要です。

php
// HTML属性内で出力 echo '<input type="text" value="' . htmlspecialchars($input, ENT_QUOTES, 'UTF-8') . '">'; // JavaScript内で出力(可能であれば出力を避ける) echo "<script>let user = " . json_encode($input) . ";</script>";

4. HTTPレスポンスヘッダーによる対策

Content-TypeX-Content-Type-Optionsなどを正しく設定することで、一部のXSS攻撃を防止できます。

例:

php
header("Content-Type: text/html; charset=UTF-8"); header("X-Content-Type-Options: nosniff");

その他の対策

  • Content Security Policy (CSP) を導入することで、外部スクリプトの読み込み制限やインラインスクリプトの実行を防ぐ

  • 入力値のバリデーションを行い、想定外の文字列を受け取らないようにする

  • HTTPOnly属性付きのセッションクッキーを使用し、JavaScriptによるアクセスを防止


まとめ

対策内容 説明
htmlspecialchars() の使用 ユーザーの入力をエスケープする基本的な方法
テンプレートエンジンの活用 自動エスケープで安全性を高める
適切なHTTPヘッダーの設定 ブラウザの振る舞いを制限する
CSPの導入 スクリプトの実行ポリシーを制御
バリデーション 不正なデータの受け取りを防止

適切な出力時エスケープを中心に、XSS対策は「入力値の処理」ではなく「出力時の対処」が最重要となります。

生成日:2025/05/03