XSS(クロスサイトスクリプティング)とは?3つの種類と開発者・運用者が取るべき対策を解説

Webサイトやサービスを運営する企業にとって、XSS(クロスサイトスクリプティング)は依然として代表的なセキュリティリスクの一つです。脆弱性が残ったまま公開されたWebアプリケーションは、利用者の個人情報やセッション情報の窃取、画面改ざんなど、さまざまな被害につながる可能性があります。
XSSには反射型・格納型・DOMベースの3種類があり、それぞれ攻撃の仕組みや対策のポイントが異なります。また、開発時のコード対策だけでなく、運用面でのWAFや脆弱性診断なども含めて多層的に対策することが重要です。
本記事では、XSSの仕組みと3種類の違い、想定される被害、開発者が実装すべき対策、運用面で取るべき対策、そして第三者視点での診断・運用支援までを体系的に解説します。

目次

[ 開く ] [ 閉じる ]
  1. XSS(クロスサイトスクリプティング)とは
  2. XSSの3つの種類
  3. 反射型XSS(Reflected XSS)
  4. 格納型XSS(Stored XSS/持続型XSS)
  5. DOMベースXSS(DOM-based XSS)
  6. XSSによって起こりうる被害
  7. 開発者が実装すべきXSS対策
  8. 出力時のエスケープ(HTMLエスケープ)
  9. 入力値のバリデーション
  10. Cookieのセキュリティ属性
  11. CSP(Content Security Policy)の活用
  12. フレームワーク利用時の注意点
  13. 運用面でのXSS対策
  14. WAF(Web Application Firewall)による検知・遮断
  15. 脆弱性診断・ペネトレーションテスト
  16. ライブラリ・フレームワークの継続的なアップデート
  17. セキュリティ教育・コードレビュー体制
  18. XSS対策の実効性を高めるための診断と運用支援
  19. まとめ

XSS(クロスサイトスクリプティング)とは

XSS(クロスサイトスクリプティング)とは

XSS(Cross-Site Scripting/クロスサイトスクリプティング)とは、Webアプリケーションの脆弱性を悪用し、攻撃者が用意した不正なスクリプト(多くの場合JavaScript)を、利用者のブラウザ上で実行させる攻撃です。
利用者がアクセスするWebページに、攻撃者が仕込んだスクリプトが埋め込まれ、本来そのサイトが意図していない動作を引き起こします。攻撃の流れは、おおまかには次のようになります。

  1. 攻撃者が、入力内容を適切に処理していないWebアプリケーションを見つける
  2. 攻撃用のスクリプトを含むデータ(URLパラメータ、投稿内容など)を仕込む
  3. 利用者がそのページにアクセスする
  4. 利用者のブラウザ上で不正なスクリプトが実行される

XSSは、IPAが公開する「安全なウェブサイトの作り方」や、OWASPが公開する「OWASP Top 10」など、主要なセキュリティガイドラインで継続的に取り上げられている脆弱性です。Webアプリケーション開発において、最初に意識すべき脆弱性の一つといえます。

XSSの3つの種類

XSSは、攻撃用スクリプトがどのように利用者のブラウザに届くかによって、主に次の3種類に分類されます。

種類 攻撃用スクリプトの保存場所 攻撃の起点 典型的なシナリオ
反射型 サーバーに保存されない 攻撃者が用意したURLを利用者がクリック 不正な検索クエリ、フィッシングメールのリンク
格納型 サーバーのデータベース等に保存 利用者が該当ページを閲覧 掲示板・コメント欄に投稿された不正スクリプト
DOMベース サーバーを介さずブラウザ内で発生 利用者がURLを開く/操作する クライアント側JavaScriptがURLパラメータ等を直接DOMに書き込む

反射型XSS(Reflected XSS)

反射型XSSは、利用者が送信したリクエストの内容を、Webアプリケーションがそのままレスポンスに含めて返してしまう場合に発生します。代表的なのは、検索キーワードやエラーメッセージなどを画面に表示する処理です。
攻撃者は、不正なスクリプトを含むURLを作成し、メールやSNSなどを介して利用者にクリックさせます。利用者がそのURLを開くと、サーバーがリクエスト内容をそのまま画面に出力し、結果として利用者のブラウザでスクリプトが実行されます。攻撃用スクリプトはサーバー側に保存されないため「反射型」と呼ばれます。

格納型XSS(Stored XSS/持続型XSS)

格納型XSSは、攻撃用スクリプトがWebアプリケーションのデータベースなどに保存され、それを閲覧した利用者全員のブラウザ上で実行されてしまうタイプです。掲示板、コメント欄、レビュー、プロフィール欄など、利用者の入力をそのまま他の利用者にも表示する機能で発生しやすくなります。
一度スクリプトが保存されると、削除されるまで複数の利用者に影響が広がる可能性があるため、反射型と比べて被害が拡大しやすい点が特徴です。

DOMベースXSS(DOM-based XSS)

DOMベースXSSは、サーバー側の処理ではなく、ブラウザ側で動作するJavaScriptに脆弱性がある場合に発生します。URLの`#`以降(フラグメント)やクエリ文字列など、クライアント側のJavaScriptが受け取った値を、適切な処理を行わずに`innerHTML`などへ書き込んでしまうと、利用者のブラウザ上でスクリプトが実行されます。
サーバーのレスポンスを介さないため、サーバーログだけでは検知が難しいケースもあります。シングルページアプリケーション(SPA)やリッチなフロントエンド実装が広まる中で、注意が必要なタイプです。

XSSによって起こりうる被害

XSSによる被害は、利用者のブラウザ上で任意のスクリプトを実行できる、という性質に起因します。一般的に想定される被害には、次のようなものがあります。

  • セッションIDやCookieの窃取によるアカウント乗っ取り
  • フォームや画面の書き換えによる、入力情報・認証情報の窃取
  • 偽のログイン画面表示などによるフィッシング誘導
  • Webサイト内容の改ざん(ブランドイメージ毀損)
  • 不正サイトへの誘導、マルウェア配布の踏み台化

被害は、利用者個人にとどまりません。Webサイトを運営する企業側でも、信頼性の低下、顧客からの問い合わせ対応、原因調査・復旧コスト、ブランドへの影響など、さまざまな影響が生じる可能性があります。

開発者が実装すべきXSS対策

開発者が実装すべきXSS対策<

XSSは、設計・実装段階で対策しておくことが基本です。ここでは、開発者が押さえておきたい代表的な対策を紹介します。

出力時のエスケープ(HTMLエスケープ)

XSS対策の中心となるのが、HTMLとして出力する際のエスケープ処理です。利用者から受け取った文字列を画面に表示するとき、`<` `>` `&` `"` `'` などの記号をHTMLエンティティに変換することで、ブラウザがスクリプトとして解釈することを防ぎます。
サーバーサイドでの簡易例(PHP):
```php
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
```
クライアントサイドの例(JavaScript):
```js
// innerHTML ではなく textContent を使い、HTMLとして解釈させない
const el = document.getElementById('output');
el.textContent = userInput;
```
出力先がHTML本文か、属性値か、URLか、JavaScriptコンテキストかによって必要なエスケープ処理が異なる点にも注意が必要です。OWASPの「XSS Prevention Cheat Sheet」では、コンテキスト別の出力エンコード方針が整理されています。

入力値のバリデーション

入力値の段階で、想定する形式や文字種に絞り込むこと(許可リスト方式)も有効です。たとえば、数値しか受け取らないフィールドであれば数値のみを許容し、メールアドレスであれば形式チェックを行います。
ただし、入力時のバリデーションだけではXSSを防ぎきれないため、出力時のエスケープと組み合わせて利用することが重要です。

Cookieのセキュリティ属性

XSSによってJavaScriptからセッションCookieが読み取られると、アカウント乗っ取りにつながります。Cookieには次のような属性を付与することで、リスクを軽減できます。

属性 役割
HttpOnly JavaScriptからのCookie参照を禁止する
Secure HTTPS通信時のみCookieを送信する
SameSite クロスサイトからのCookie送信を制限する

セッションを管理するCookieには、原則として`HttpOnly`と`Secure`を付与し、用途に合わせて`SameSite`属性も設定することが推奨されます。

CSP(Content Security Policy)の活用

CSPは、ブラウザに対して「どこから読み込んだスクリプトやリソースの実行を許可するか」を指定するための仕組みです。HTTPレスポンスヘッダーで設定し、不正に挿入されたインラインスクリプトや外部スクリプトの実行をブラウザ側で抑止できます。
最小限の例:
```
Content-Security-Policy: default-src 'self'; script-src 'self'
```
上記の例では、自サイト(`'self'`)から読み込んだスクリプトのみを許可し、インラインスクリプトや外部スクリプトの実行を制限します。実際の運用では、利用しているライブラリや広告、解析ツールなどとの兼ね合いを確認しながら、段階的にポリシーを厳格化していくことが現実的です。
CSPはXSSの影響を軽減する有効な手段ですが、単独で全てを防げるものではありません。出力時のエスケープなどの基本対策と組み合わせて利用することが重要です。

フレームワーク利用時の注意点

ReactやVue、Angularといったモダンなフレームワークでは、テンプレート内に変数を埋め込む際に自動的にエスケープが行われる仕組みが備わっていることが一般的です。一方で、次のような書き方をすると、自動エスケープを回避してしまい、XSSの原因になることがあります。

  • Reactの`dangerouslySetInnerHTML`
  • Vueの`v-html`
  • AngularでサニタイズをバイパスするAPI

フレームワークの自動エスケープに依存するだけでなく、HTMLを動的に組み立てる箇所では、本当にHTMLを差し込む必要があるのかを設計段階で見直し、必要な場合は安全なライブラリでのサニタイズを併用することが望まれます。

運用面でのXSS対策

開発時の対策に加えて、運用面でも複数の対策を組み合わせることが重要です。

WAF(Web Application Firewall)による検知・遮断

WAFは、Webアプリケーションへの通信を監視し、攻撃と疑われるリクエストを検知・遮断する仕組みです。XSSに代表される代表的な攻撃パターンへのシグネチャを備えていることが多く、既存システムの前段に設置することで、想定外の攻撃リクエストをブロックする効果が期待できます。
ただし、WAFはあくまでも防御層の一つであり、アプリケーション側の脆弱性そのものを修正するものではありません。アプリケーション側の対策と組み合わせて利用することが前提となります。

脆弱性診断・ペネトレーションテスト

実装後のWebアプリケーションに対しては、第三者による脆弱性診断やペネトレーションテストを実施することで、開発時に見落とした脆弱性を発見しやすくなります。
特にXSSは、画面遷移や入出力箇所が多くなるほど見落としが発生しやすくなる脆弱性です。リリース前や、大きな機能追加・改修のタイミングで定期的に診断を行うことが望ましいといえます。

ライブラリ・フレームワークの継続的なアップデート

利用しているフレームワークやライブラリに、XSS関連の脆弱性が報告されることもあります。アップデートの情報を定期的に確認し、必要なバージョンアップを計画的に行うことが重要です。

セキュリティ教育・コードレビュー体制

XSSは、コードの書き方一つで埋め込まれてしまう脆弱性です。開発者に対するセキュアコーディングの教育や、コードレビューでXSSの観点を含めることで、リリース前に脆弱性を発見しやすくなります。

XSS対策の実効性を高めるための診断と運用支援

XSS対策の実効性を高めるための診断と運用支援

ここまでに紹介したように、XSS対策は「開発時の実装」と「運用時の検証・防御」を組み合わせることが基本です。一方で、自社内だけで全てを完結させようとすると、次のような課題が出てくることがあります。

  • 開発者によってXSS対策の理解度に差があり、レビューで見落としが発生する
  • 機能追加・改修のたびに、診断や検証の工数を確保しきれない
  • WAFを導入したが、誤検知やアラート対応に手が回らない
  • 過去にリリースした画面・APIまでカバーした診断ができていない

このような場合は、攻撃者視点での脆弱性診断やペネトレーションテストを通じて、第三者の目で自社サイトのリスクを定期的に確認するアプローチが有効です。
GMOインターネットグループでは、企業向けにサイバーセキュリティ対策を支援する「GMOサイバーセキュリティ byイエラエ」を提供しています。Webアプリケーション脆弱性診断やペネトレーションテストを通じて、XSSをはじめとする実装上の脆弱性を可視化し、修正の優先度や運用上の改善ポイントまで含めた支援を受けられる点が特徴です。
開発・運用双方の体制を踏まえた診断や、継続的なセキュリティ運用の見直しを進めたい場合は、専門サービスの活用も選択肢として検討してみてください。

まとめ

この記事では、XSS(クロスサイトスクリプティング)の仕組み、反射型・格納型・DOMベースの3種類、想定される被害、開発者が実装すべき対策(エスケープ、入力検証、Cookieのセキュリティ属性、CSP、フレームワーク利用時の注意点)、運用面での対策(WAF、脆弱性診断、アップデート、教育・レビュー)について解説しました。
XSS対策は、いずれか一つの仕組みに頼るのではなく、開発時のセキュアな実装と、運用時の検証・防御を組み合わせることがポイントです。脆弱性や設定不備は、外部からは見えにくい形で残っていることもあるため、定期的な確認と改善が欠かせません。
自社のセキュリティリスクを把握し、具体的な対策につなげたい場合は、「GMOサイバーセキュリティ byイエラエ」への相談も選択肢のひとつです。Webアプリケーション脆弱性診断やペネトレーションテストを通じて、攻撃者視点でのリスク把握と、現場の運用に合った対策の検討を進めやすくなります。

文責:GMOインターネットグループ株式会社