用語辞典
XSS(クロスサイトスクリプティング)とは — 他人のブラウザで勝手にコードが動く穴
XSS(クロスサイトスクリプティング)は、攻撃者が仕込んだスクリプトを、別の利用者のブラウザ上で実行させてしまう脆弱性です。セッション窃取や画面改ざんにつながります。3つの型(蓄積/反射/DOM)、仕組みの図解、そして本命の防御(出力エスケープ・フレームワークの自動エスケープ・CSP)を、攻撃手順を伏せて防御目線で解説します。
「フォームに入れた文字が、別の人の画面でスクリプトとして動く」——それがXSSです。仕組みと、確実な防ぎ方をゼロから解説します(攻撃手順は載せません)。
3つの型
XSSは「悪意ある文字列がどこを通って実行されるか」で3つに分かれます。
| 型 | どう仕込まれるか |
|---|---|
| 蓄積型(Stored) | 投稿やプロフィール等に保存され、閲覧した全員のブラウザで実行される(最も危険) |
| 反射型(Reflected) | URLパラメータ等がそのまま画面に反射され、リンクを踏んだ人で実行される |
| DOM型(DOM-based) | サーバーを介さず、ブラウザ側のJSが入力を危険に扱うことで発生 |
なぜ危険か(仕組み)
ブラウザは、ページに書かれた <script> を「正規のコード」として実行します。攻撃者の文字列がそのままHTMLとしてページに混ざると、ブラウザはそれを本物のコードと区別できません。
被害は「そのページでできること」全部です。RCE がサーバー側の最悪なら、XSSはクライアント側(利用者)の最悪にあたります。
防御:本命は「出力時のエスケープ」
XSSは“入力”でなく“出力”で防ぐのが基本です。値を画面に出す瞬間に、HTMLとして解釈されない形へ変換します。
出力時にエスケープする(最重要)
ユーザー由来の値を画面に出すとき、< > & " ' などをHTMLエンティティに変換。出す場所(HTML本文・属性・JS・URL)ごとに正しい方式で。
フレームワークの自動エスケープを外さない
React/Vue/各テンプレートは既定で自動エスケープします。dangerouslySetInnerHTML や v-html のような“生HTML挿入”を避けるだけで大半を防げます。
CSP(Content-Security-Policy)で多層防御
万一漏れても、許可していないスクリプトの実行をブラウザ側で止める。インラインスクリプトの制限などで被害を抑える。
Cookieを守る
セッションCookieに HttpOnly を付け、JSから読めなくする。盗まれても被害を限定。
ITDの視点:最大の防御は“自分で穴を開けないこと”
モダンなフレームワークは既定で安全側に倒れています。XSSの多くは、開発者が 「HTMLをそのまま入れたい」と自動エスケープを意図的に外した瞬間に生まれます。どうしてもHTMLを許可するなら、自前の文字列処理ではなく実績あるサニタイザを通すこと。「便利のために安全を外す」のが最大のリスクです。
次に読む
よくある質問
QXSSで何が起きる?
攻撃者が仕込んだスクリプトが、被害者のブラウザで本物のページの一部として実行されます。結果としてセッションの窃取(なりすましログイン)、入力の盗み見、画面の改ざん、別の操作の自動実行などが起こり得ます。
QXSSの一番の防御は?
『出力時のエスケープ』です。ユーザー由来の値を画面に出すとき、HTMLとして解釈されないように変換します。React/Vue等のテンプレートは既定でこれを行うので、その自動エスケープを自分で外さない(dangerouslySetInnerHTML等を避ける)ことが最大の対策です。加えてCSPで多層防御します。
Q入力時にサニタイズすれば十分?
不十分になりがちです。本命は『出力する文脈(HTML本文・属性・JS・URL)ごとに正しくエスケープする』こと。入力フィルタだけだと文脈の取り違えで漏れます。HTMLを許可したい場合だけ、信頼できるサニタイザを使います。