XSS は Cross-Site Scripting の略で、攻撃者が用意したスクリプトを別のユーザーのブラウザ上で実行させる攻撃です。
掲示板、コメント欄、プロフィール、問い合わせ内容、管理画面のメモなど、誰かが入力した内容を別の画面に表示する場所で問題になります。
まず押さえたいポイント
- 入力値をHTMLとして表示してしまうと起きやすい
- Cookie、セッション、画面操作、偽フォーム表示などが狙われる
- 基本対策は出力時のエスケープ
- HTMLを許可する場合は、許可するタグや属性を厳しく制限する
- CSPやCookie属性も被害を減らす助けになる
どんな場面で出てくる?
ユーザー名、コメント、商品レビュー、問い合わせ本文、社内メモ、チャット、エラーメッセージなどで出てきます。
たとえば、問い合わせフォームに入力された文字列を管理画面で表示するとき、HTMLとして解釈される形で出してしまうと、管理者のブラウザ上で不正なスクリプトが動く可能性があります。
XSSは「入力された瞬間」ではなく、「表示された瞬間」に問題になることが多い攻撃です。
そのため、入力チェックだけでなく、どの文脈に出力するのかを見てエスケープする必要があります。HTML本文、HTML属性、JavaScript、URLでは必要な扱いが変わります。
よくある誤解
「危険な文字を入力時に削ればよい」と考えると、抜け漏れが起きやすくなります。
同じ文字列でも、HTMLとして出すのか、属性値として出すのか、JavaScript内に出すのかで安全な処理は変わります。
また、モダンなフレームワークを使えば必ず安全というわけでもありません。
React、Vue、Laravel Bladeなどは標準でエスケープしてくれる場面が多いですが、dangerouslySetInnerHTML や生HTML出力、Markdown変換、外部HTML埋め込みでは注意が必要です。
実務で見るポイント
XSS対策では、ユーザー入力を表示する箇所を洗い出し、テンプレートエンジンの自動エスケープを外していないかを確認します。
HTML入力を許可する場合は、サニタイズ方針を決め、許可するタグを最小限にします。
加えて、Cookieに HttpOnly や Secure、SameSite を設定する、CSPを段階的に導入する、管理画面で外部入力を表示する箇所を重点的に見る、といった防御も有効です。
初心者はまず、「表示時にエスケープする」「生HTMLを安易に許可しない」「管理画面も攻撃対象になる」と覚えるとよいです。