緊急PHP2Shell(CVE-2026-109618 / 109619)公表から1日/PHP 8.1 以前は修正版なし今すぐ診断
  1. ホーム
  2. ブログ
  3. PHP のセキュリティ

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' を指定してください。
シングルクォートも変換され、属性の中でも安全になります。

無料ツールPHP2Shell 脆弱性チェッカーPHP のバージョンとサーバー会社を選ぶだけで、危険度と今やることが分かります。

参考にした情報

この記事の情報

2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。

URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。

無料で診断する

この記事の著者

編集部