クロスサイトスクリプティング(XSS)とは
クロスサイトスクリプティング(XSS)は、悪意のあるスクリプトがWebサイトに埋め込まれ、ユーザーのブラウザ上で実行されてしまう脆弱性です。主な原因はユーザーの入力値を適切にエスケープせず、HTMLに出力してしまうことにあります。
スクリプトとは、ブラウザ上で動作する簡易的なプログラムのことです。JavaScriptなどが該当し、フォームの自動補完やボタン操作など、Webページに動きを与えるために使われます。
XSSによって起こる脅威
XSSによって引き起こされる主な脅威や被害の具体例をまとめました。
Cookieが盗難されると、不正ログインが可能になるので特に気を付けたい脅威です。
分類 | 内容 | 具体例 |
---|---|---|
🎭 なりすまし | セッションハイジャック、 ユーザーなりすまし |
Cookieの盗難・ セッショントークンの不正使用 |
🕵️♂️ 情報漏洩 | ユーザーの個人情報・ 内部情報の窃取 |
フォーム内の入力値、 アカウント情報などの抜き取り |
![]() |
偽フォーム・偽ページへの誘導 | ログインフォームを偽装し ID/PWを盗む |
✍️ ページ改ざん | 表示内容の書き換え | 管理画面や掲示板を 偽の内容にすり替え |
🦠 マルウェア感染 | 外部スクリプト経由での 攻撃コード配布 |
Drive-by download や Cryptojacking など |
📤 不正リクエスト送信 | 利用者の権限でAPIや 管理操作を実行 |
勝手にメッセージ投稿、 購入処理、設定変更など |
📉 信用・ブランド失墜 | ユーザーへの悪影響 → サービス離れ |
ユーザーからの信頼喪失、SNS炎上など |
XSSの種類
1. 反射型XSS(Reflected XSS)
ユーザーがアクセスしたURLに含まれる悪意のあるスクリプトが、リクエストで一時的に送られたデータが、サーバーに保存されずにそのまま画面に表示されて実行されるタイプです。
特徴
- 攻撃は一度限りで、ページの再読み込みで消える
- 入力された内容がそのままHTMLに埋め込まれるような箇所が狙われやすい
発生しやすい例
- 入力内容をそのままエラーメッセージとして表示
- 検索フォームの検索語を結果ページに出力
- URLパラメータをHTMLに表示
2. 格納型XSS(Stored XSS)
悪意のあるスクリプトがサーバーに保存され、後から他のユーザーにそのまま表示されて実行されるタイプです。被害が広範囲に及ぶ可能性があります。
特徴
- 攻撃コードが永続的に保存される
- ページを開くたびに攻撃が実行される
発生しやすい例
- 掲示板やコメント機能
- プロフィールや投稿内容の表示部分
- ファイルアップロード時のメタ情報表示
3. DOM型XSS(DOM-based XSS)
サーバー側ではなく、ブラウザ上のJavaScriptがDOMを介して直接スクリプトを実行してしまうタイプです。
DOM(Document Object Model)とは、HTMLやXMLを構成する要素をプログラム上で参照・操作するための仕組みです。
特徴
- 攻撃の処理がすべてクライアント(ブラウザ)側で完結するため、検知しづらい
- スクリプトはURLのパラメータやハッシュ(
#
)から挿入される
発生しやすい例
- URLのクエリをそのままinnerHTMLに挿入
-
document.write()
で動的にコンテンツを生成
XSSの対策
XSSの主な対策をまとめました。
特に出力時の「エスケープ処理」は最も重要で有効な対策です。
1. 出力時のエスケープ処理
すべてのユーザー入力をHTML出力する前に、コードして解釈されてしまう記号を表示用の文字列に変換する適切なエスケープ処理を施すことで悪意のあるスクリプトの実行を防ぐことができます。
エスケープにより、記号を変換
<script>alert('XSS')</script>
<script>alert('XSS')</script>
文字 | エスケープ後 |
---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
2. XSS対策に有効なセキュリティHTTPレスポンスヘッダを使用する
-
Content-Security-Policy (CSP)
インラインスクリプトの実行を防ぎ、悪意あるスクリプトの読み込みを制限できます。
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
-
X-Content-Type-Options
レスポンスのMIMEタイプが予期しない形で解釈されるのを防止します。
X-Content-Type-Options: nosniff
3. CookieにHttpOnly属性を付与する
CookieをJavaScriptからアクセスできないように制限することができます。これにより、Cookieの盗難を防止できます。
Set-Cookie: id=stNeb; Expires=Thu, 10 Apr 2025 09:30:00 GMT; Secure; HttpOnly
4. Content-Typeと文字コードの明示
HTTPレスポンスヘッダのContent-Type
に文字コード(例:charset=UTF-8
)を明記します。指定がない場合、ブラウザが誤った文字コード(例:UTF-7)で解釈し、意図しないスクリプト実行が発生する可能性があります。
Content-Type: text/html; charset=utf-8
まとめ
XSSは、ユーザーとWebアプリケーションの信頼関係を悪用する非常に危険な攻撃です。特に、入力値を画面に出力する処理がある場合は状況に応じて適切にエスケープ処理を行うことが重要です。フロントエンド・バックエンドの両面からしっかりと対策を行い、安全なWebアプリケーションを構築していきましょう。