PHP の XSS 対策|htmlspecialchars の正しい使い方
PHP で作ったサイトのクロスサイトスクリプティング(XSS)対策。出力するときのエスケープの基本と、間違えやすい所をまとめた。
XSS(クロスサイトスクリプティング)は、入力された文字をそのまま画面に出したときに、悪意のあるスクリプトを動かされる弱点。PHP での対策の基本をまとめた。
この記事の要点
- 画面に出すときに、必ずエスケープする(入力のときではなく、出力のとき)
htmlspecialchars($s, ENT_QUOTES, 'UTF-8')を使う- 属性・URL・JavaScript の中は、それぞれ別の注意が要る
- Content-Security-Policy を足すと、万一のときの被害を小さくできる
基本:出力するときにエスケープ
- HTML に出す値は、すべて
htmlspecialchars()を通す - 引数は
ENT_QUOTES(シングルクォートも変換)と'UTF-8'を指定する - PHP 8.1 から、既定値も
ENT_QUOTES | ENT_SUBSTITUTEになった - 毎回書くのが手間なら、短い関数にまとめて使う
間違えやすい所
| 出す場所 | 注意すること |
|---|---|
| HTML の本文 | htmlspecialchars() で足りる |
| 属性の値 | 必ずクォートで囲み、htmlspecialchars() を通す |
| リンク先(href) | javascript: で始まる値を弾く。http・https だけを許す |
| JavaScript の中 | json_encode() で値を渡す。文字列をそのまま埋め込まない |
| 管理画面 | 管理者しか見ない画面でも、エスケープは必要 |
入力のときに消すだけでは足りない
入力のときに <script> を消すような対策は、すり抜けられやすい。出力のときのエスケープが基本。
守りを重ねる
- Content-Security-Policy(CSP)で、動かせるスクリプトの出どころを絞る
- Cookie に HttpOnly を付けて、スクリプトから読めないようにする
- フレームワークのテンプレート(自動でエスケープするもの)を使う
よくある質問
入力のときにタグを消せば、XSS は防げますか?
防げません。
すり抜けられやすいので、画面に出すときにエスケープするのが基本です。
htmlspecialchars の引数は何を指定すればいいですか?
ENT_QUOTES と 'UTF-8' を指定してください。
シングルクォートも変換され、属性の中でも安全になります。
参考にした情報
この記事の情報
2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。
URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。
無料で診断する


