XSS — 他人のブラウザで悪いスクリプトを動かす攻撃

概要 — まず全体をつかむ

XSS(クロスサイトスクリプティング)は、他人のブラウザで、攻撃者のスクリプトを動かす攻撃です。

詳細 — 1段階ずつ追う

どう起きる?

たとえばコメント欄に、攻撃者が「スクリプト入りの文字列」を書き込む。サービスがそれをそのまま画面に表示すると、そのページを見た人のブラウザで、そのスクリプトが実行されてしまいます。

結果、Cookie(ログイン状態)を盗まれる、勝手に操作される、などの被害が起きます。

アニメーション『XSSの流れ(仕込み→表示→実行)』を開く
XSS ― 他人のブラウザで、攻撃者のスクリプトが動く投稿表示① 攻撃者悪意のある投稿者投稿欄・コメント欄などに「悪いスクリプト」を紛れ込ませて送信する例: <script>…盗む…</script>② サイトエスケープを忘れた受け取った文字列をそのまま他の利用者のページに表示してしまう=スクリプトが混ざる③ 被害者のブラウザ普通に見ただけページを開いた瞬間にそのスクリプトが実行→ Cookie・セッションを盗む/勝手に操作する🛡 防御出力を文脈に応じてエスケープ(HTML/属性/URL/JSで変換)+ CSP で、許可していないスクリプトの実行をブラウザ側で止めるひとことで言うと ― 他人のブラウザで悪いJSを動かす攻撃
この部分をもっと深く(中級

XSS は「信頼できない入力が、エスケープされずに HTML・JS・URL へ出力される」ときに成立します。経由する場所で種類が分かれます。

  • 反射型 — リクエストに含めた値が、その応答ページにそのまま出る
  • 格納型 — 保存された値(コメントなど)が、後で別の利用者の画面に出る
  • DOM型 — サーバを介さず、ブラウザ内の JavaScript が値を危険な形で DOM へ書き込む
アニメーション『XSSの流れ(仕込み→表示→実行)』を開く
XSS ― 他人のブラウザで、攻撃者のスクリプトが動く投稿表示① 攻撃者悪意のある投稿者投稿欄・コメント欄などに「悪いスクリプト」を紛れ込ませて送信する例: <script>…盗む…</script>② サイトエスケープを忘れた受け取った文字列をそのまま他の利用者のページに表示してしまう=スクリプトが混ざる③ 被害者のブラウザ普通に見ただけページを開いた瞬間にそのスクリプトが実行→ Cookie・セッションを盗む/勝手に操作する🛡 防御出力を文脈に応じてエスケープ(HTML/属性/URL/JSで変換)+ CSP で、許可していないスクリプトの実行をブラウザ側で止めるひとことで言うと ― 他人のブラウザで悪いJSを動かす攻撃

種類は違っても根本原因は一つ——出力の瞬間に、文脈に合った変換をしていないこと。結果として Cookie(ログイン状態)を盗まれる、勝手に操作される、などの被害が起きます。

どう防ぐ?

  1. 出力エスケープ — 画面に出すとき、<> などを「ただの文字」に変換する。これでスクリプトとして動かない
  2. 文脈に合わせる — HTML・属性・URL・JS の中で、必要なエスケープが違う
  3. CSP(コンテンツセキュリティポリシー) — そもそも許可していないスクリプトの実行を、ブラウザ側で止める

ポイントは「入力を消すのではなく、出力を安全にする」こと。データは受け取ってよく、出す瞬間に無害化します。

この部分をもっと深く(中級

守りは出力側に置きます。

  1. 文脈別の出力エスケープ — HTML本文・HTML属性・JS・URL では必要な変換が違う。出す先に合った規則で「ただの文字」に変換する
  2. CSP(コンテンツセキュリティポリシー) — スクリプトの出所を制限し、許可していないスクリプトの実行をブラウザ側で止める
  3. HttpOnly Cookie — JavaScript から Cookie を読めなくし、万一スクリプトが動いても盗ませない

ポイントは「入力の混入ではなく、出力の扱いで防ぐ」こと。データは受け取ってよく、出す瞬間に無害化します。

登場人物メモ:

  • ※1 出力文脈 — 値を出す先(HTML・属性・JS・URL)。文脈ごとに変換規則が違う
  • ※2 CSP — スクリプトの出所を制限し、想定外の実行を止める仕組み

⚠️ 気をつける

  • 入力検証だけに頼る — 保存された値が別の画面で出るときに漏れる(格納型XSS)
  • エスケープの文脈ミス — HTML用のエスケープをURLやJSにそのまま使う
  • innerHTML の乱用 — 受け取った文字列をそのままHTMLとして挿入しない
この部分をもっと深く(中級
  • 入力検証だけに頼る — 保存された値が別の画面で出るときに漏れる(格納型XSS)
  • エスケープの文脈ミス — HTML用のエスケープを URL や JS にそのまま使う
  • innerHTML の乱用 — 受け取った文字列をそのまま HTML として挿入しない
  • CSPを免罪符にする — CSP は補助。エスケープの代わりにはならない

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. XSSの基本的な防ぎ方は?

2. XSS(クロスサイトスクリプティング)が悪用するのは?

3. XSS の正式名称をカタカナで答えてください(クロスサイト…)。

4. XSSが成功したときに起きやすい代表的な被害はどれ?

5. 出力時にエスケープすると、`<script>` のような文字列はどうなる?

6. XSS対策の考え方として正しいのはどれ?

7. そもそも許可していないスクリプトの実行を、ブラウザ側で止める仕組みはどれ?

8. 保存された値が後で別の利用者の画面に出て発火するXSSの種類を何という(漢字+型)?