XSS(クロスサイトスクリプティング)
XSSとは
XSS(Cross-Site Scripting)は、Webサイトの入力欄などを悪用して、攻撃者が用意したスクリプトを他の利用者のブラウザで実行させる攻撃です。[[Webセキュリティ]] の代表的な脅威で、届出件数でも常に上位に挙がります。
例えば掲示板のコメント欄に [[JavaScript]] のコードをそのまま書き込めてしまうと、そのページを開いた別の利用者のブラウザでコードが実行され、Cookie の窃取や偽の入力フォーム表示などにつながります。
3つの種類
| 種類 | 仕組み |
|---|---|
| 反射型 | URL に仕込まれた値がレスポンスにそのまま反映されて実行される |
| 格納型 | 投稿などとしてサーバーに保存され、閲覧者全員のブラウザで実行される |
| DOM型 | サーバーを経由せず、ブラウザ内の JavaScript が URL 等の値を不用意に画面へ反映して発生 |
格納型は攻撃コードが保存されて閲覧者全員に届くため、特に影響範囲が広い種類です。
対策の基本
- エスケープ処理:
<や"などの記号を [[HTML]] 上で無害な表記(<など)に変換してから出力する — 最も基本で確実な対策です - フレームワークの標準に乗る: [[React]] などのモダンフレームワークは出力時に自動でエスケープします。
dangerouslySetInnerHTMLのような「エスケープを外す機能」を安易に使わないことが重要です - CSP(Content Security Policy): 実行を許可するスクリプトの出所を HTTP ヘッダーで制限する — 書き方は [[セキュリティヘッダー(CSP・HSTS)]] を参照
- HttpOnly 属性: Cookie に JavaScript から触れなくし、窃取の被害を抑える
- [[WAF]] — 既知の攻撃パターンを通信の段階で遮断する補助的な防御
初学者向けポイント
- 「ユーザーが入力した値を、そのまま HTML に出力しない」が合言葉です
- 対策は入力時ではなく出力時のエスケープが原則 — 入力チェックだけでは漏れが出ます
- 名前が似ている [[CSRF]] は「偽のリクエストを送らせる」攻撃で、スクリプトを実行させる XSS とは仕組みが異なります
関連技術とのつながり
- [[Webセキュリティ]] — XSS は Web アプリの代表的な脆弱性のひとつ
- [[JavaScript]] — 攻撃に使われるのも、DOM 型の原因になるのもこの言語
- [[CSRF]] — 同じ「クロスサイト」でも狙いと仕組みが別物。セットで理解したい
- [[WAF]] — 通信段階で攻撃パターンを検知・遮断する補助策
- [[セッション管理]] — 窃取の標的になるセッションIDと、HttpOnly 属性による防御
Q: XSS対策として最も基本となるのはどれ?
- [x] 出力時に記号をエスケープ処理して無害化する
- [ ] パスワードを長くする
- [ ] 通信をHTTPSにする
解説: XSS の基本対策は出力時のエスケープ処理です。入力値をそのまま HTML に出力しないことが原則です。
Q: 格納型XSSの特徴はどれ?
- [ ] サーバーを経由せずブラウザ内だけで発生する
- [x] 攻撃コードがサーバーに保存され、閲覧者全員のブラウザで実行される
- [ ] URLに仕込まれた値がその場で反映される
解説: 格納型は投稿などとして保存されるため、ページを見た全員に攻撃が届き影響範囲が広くなります。
Q: CookieをJavaScriptから読めなくしてXSSの被害を抑える仕組みはどれ?
- [ ] SameSite属性
- [ ] CSP
- [x] HttpOnly属性
解説: HttpOnly 属性を付けた Cookie は JavaScript から参照できず、スクリプトによる窃取を防げます。