PHP セキュリティ解説 · 防御向け
PHP の XSS とは?防ぎ方
クロスサイトスクリプティングは今も最も多い Web の脆弱性の一つです。PHP では、出力先に合わせたエスケープをせずにデータを HTML に出すことが原因の大半です。
最終更新
どんな問題か
反射型 XSS は現在のリクエストの値をそのまま返し、格納型 XSS はコメントなどに保存して全員に表示し、DOM ベース XSS はクライアント側の JavaScript で起きます。いずれもブラウザがサイトの権限でスクリプトを実行し、セッションを盗んだり利用者になりすましたりできます。MITRE では CWE-79 に分類されます。
見つけ方
- テンプレートや PHP ファイルで、
htmlspecialchars()やテンプレートのエスケープを通さずに変数を出すecho、print、<?=を検索します。 - HTML 属性、インライン JavaScript、URL、CSS に入る値は特に注意します。HTML エスケープだけでは足りません。
- フレームワークのセキュリティチェックや OWASP ZAP などのスキャナーを、自分が管理するステージング環境に対して使います。
直し方
- 出力時にエスケープします:HTML 本文と引用符付き属性には
htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')。 - 自動エスケープが有効なテンプレートエンジン(Twig、Blade、Latte)を使い、信頼できないデータに生出力フィルターを使わないこと。
- script ブロックにデータを入れるときは
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT付きのjson_encode()を使い、href に入れる URL は検証します。 - 多層防御として Content-Security-Policy を追加し、セッション Cookie に HttpOnly、Secure、SameSite を付けます。
読み取り専用の確認と安全な書き方
# Find raw echo of request data (read-only, rough first pass)
grep -rnE "echo\s+\$_(GET|POST|REQUEST|COOKIE)" --include=*.php . | grep -v /vendor/
// Escape on output, for the HTML context
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
# Defense in depth: a Content-Security-Policy header (example)
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'入力からタグを取り除けば十分では?
入力の検査も役立ちますが、確実に XSS を防ぐのは文脈に合わせた出力時のエスケープです。OWASP も出力エンコードを優先するよう勧めています。
strip_tags() で XSS は防げますか?
確実ではありません。属性や JavaScript の文脈に対応できず、使い方も誤りやすいため、文脈に応じたエスケープを使ってください。
ほかの PHP の脆弱性の種類
- PHP オブジェクトインジェクションとは?直し方PHP オブジェクトインジェクションは、利用者が操作できる入力が unserialize() に届くと起き、マジックメソッドを通じて攻撃者が選んだ処理を実行させるオブジェクトが生成され得ます。
- PHP ファイルインクルード(LFI/RFI)とは?直し方ファイルインクルードは利用者の入力が include や require のパスを左右すると起き、攻撃者はローカルファイルを読み(LFI)、allow_url_include が有効ならリモートのコードを実行できます(RFI)。
- PHP の SSRF とは?直し方サーバーサイドリクエストフォージェリ(SSRF)は PHP アプリが利用者の指定した URL を取得すると起き、攻撃者はサーバー経由で内部サービスやクラウドのメタデータに到達できます。
- phpinfo() の露出:なぜ問題か、どう直すか公開された phpinfo() ページは正確な PHP のバージョン、読み込まれたモジュール、ファイルパス、しばしば環境変数や秘密情報まで明かし、PHP2Shell のような脆弱性を狙う手がかりになります。
出典
外部リンクは本サイトの外に移動します。本サイトはエクスプロイトコードを掲載しません。
- CWE-79: Cross-site Scripting — MITRE CWE
- Cross Site Scripting Prevention Cheat Sheet — OWASP Cheat Sheet Series
- htmlspecialchars() — PHP Manual