本文へスキップ
>_ITDITDセキュリティ対策プラットフォーム

用語辞典

#XSS#脆弱性#Web

XSS(クロスサイトスクリプティング)とは — 他人のブラウザで勝手にコードが動く穴

XSS(クロスサイトスクリプティング)は、攻撃者が仕込んだスクリプトを、別の利用者のブラウザ上で実行させてしまう脆弱性です。セッション窃取や画面改ざんにつながります。3つの型(蓄積/反射/DOM)、仕組みの図解、そして本命の防御(出力エスケープ・フレームワークの自動エスケープ・CSP)を、攻撃手順を伏せて防御目線で解説します。

公開日 2026-06-08 更新日 2026-06-08 4分で読める

「フォームに入れた文字が、別の人の画面でスクリプトとして動く」——それがXSSです。仕組みと、確実な防ぎ方をゼロから解説します(攻撃手順は載せません)。

3つの型

XSSは「悪意ある文字列がどこを通って実行されるか」で3つに分かれます。

どう仕込まれるか
蓄積型(Stored)投稿やプロフィール等に保存され、閲覧した全員のブラウザで実行される(最も危険)
反射型(Reflected)URLパラメータ等がそのまま画面に反射され、リンクを踏んだ人で実行される
DOM型(DOM-based)サーバーを介さず、ブラウザ側のJSが入力を危険に扱うことで発生

なぜ危険か(仕組み)

ブラウザは、ページに書かれた <script> を「正規のコード」として実行します。攻撃者の文字列がそのままHTMLとしてページに混ざると、ブラウザはそれを本物のコードと区別できません。

① 攻撃者が“文字列”を投稿(コメント・名前・URL等)
↓ サーバーがエスケープせず出力
② その文字列がHTMLの一部としてページに混入
↓ 被害者がページを開く
③ 被害者のブラウザでコードが実行=セッション窃取・なりすまし
ユーザー由来の文字列を“そのまま”出すと、ブラウザはそれをコードとして実行してしまう。

被害は「そのページでできること」全部です。RCE がサーバー側の最悪なら、XSSはクライアント側(利用者)の最悪にあたります。

防御:本命は「出力時のエスケープ」

XSSは“入力”でなく“出力”で防ぐのが基本です。値を画面に出す瞬間に、HTMLとして解釈されない形へ変換します。

1

出力時にエスケープする(最重要)

ユーザー由来の値を画面に出すとき、< > & " ' などをHTMLエンティティに変換。出す場所(HTML本文・属性・JS・URL)ごとに正しい方式で。

2

フレームワークの自動エスケープを外さない

React/Vue/各テンプレートは既定で自動エスケープします。dangerouslySetInnerHTMLv-html のような“生HTML挿入”を避けるだけで大半を防げます。

3

CSP(Content-Security-Policy)で多層防御

万一漏れても、許可していないスクリプトの実行をブラウザ側で止める。インラインスクリプトの制限などで被害を抑える。

4

Cookieを守る

セッションCookieに HttpOnly を付け、JSから読めなくする。盗まれても被害を限定。

ITDの視点:最大の防御は“自分で穴を開けないこと”

モダンなフレームワークは既定で安全側に倒れています。XSSの多くは、開発者が 「HTMLをそのまま入れたい」と自動エスケープを意図的に外した瞬間に生まれます。どうしてもHTMLを許可するなら、自前の文字列処理ではなく実績あるサニタイザを通すこと。「便利のために安全を外す」のが最大のリスクです。

次に読む

よくある質問

QXSSで何が起きる?
A

攻撃者が仕込んだスクリプトが、被害者のブラウザで本物のページの一部として実行されます。結果としてセッションの窃取(なりすましログイン)、入力の盗み見、画面の改ざん、別の操作の自動実行などが起こり得ます。

QXSSの一番の防御は?
A

『出力時のエスケープ』です。ユーザー由来の値を画面に出すとき、HTMLとして解釈されないように変換します。React/Vue等のテンプレートは既定でこれを行うので、その自動エスケープを自分で外さない(dangerouslySetInnerHTML等を避ける)ことが最大の対策です。加えてCSPで多層防御します。

Q入力時にサニタイズすれば十分?
A

不十分になりがちです。本命は『出力する文脈(HTML本文・属性・JS・URL)ごとに正しくエスケープする』こと。入力フィルタだけだと文脈の取り違えで漏れます。HTMLを許可したい場合だけ、信頼できるサニタイザを使います。