クロスサイトスクリプティング(cross site scripting)
入力をそのまま表示するサイトを踏み台にして、閲覧者のブラウザで命令を動かす攻撃。
もう少し詳しい説明
クロスサイトスクリプティングは、入力された文字をそのまま画面に出してしまうサイトを踏み台にして、そのサイトを見に来た人のブラウザで勝手な命令を動かす攻撃です。頭文字をとって XSS と書きます。
(頭文字なら CSS になりますが、それだとCSS(Webページの見た目を決める言語)と同じ綴りになってしまいます。そこで Cross の部分を X と書いて XSS にしています。)
先に言葉を2つ説明します
ブラウザは、Google Chrome、Microsoft Edge、Safari など、Webページを見るソフトです。手元のパソコンやスマートフォンで動いています。
スクリプトは、Webページの中に書いておく、短いプログラムです。ブラウザがページを読み込むときに、一緒に実行されます。ボタンを押したときの動きや、入力の確認などに使われています。
この攻撃は、本来そのサイトの作者が書くはずのスクリプトを、他人が外から書き込んでしまうという話になります。
なぜ起きるのか
掲示板やレビュー欄など、利用者が書いた文字をそのまま画面に表示する仕組みは、どこにでもあります。
Webページは、札(タグ)で囲むことで「ここからはスクリプトだ」と示せるようになっています。
もし投稿された文字をそのまま画面に流し込むと、どうなるか。投稿の中にその札が混ざっていた場合、ブラウザは札の中身をプログラムとして実行してしまいます。「文字として表示する」つもりだったものが、「実行する」に変わります。
原因は、SQLインジェクション(入力した文字が、データベースへの命令の一部として読まれてしまう攻撃)とまったく同じ形をしています。入力された文字を、ただの文字として扱っていない。違うのは、読み違えるのがデータベースではなく閲覧者のブラウザだという点です。
被害を受けるのは閲覧者
ここがこの攻撃のいちばん大事なところです。仕掛けられるのはサイトですが、被害を受けるのはそのサイトを見に来た利用者です。
- ログイン中であることを示すクッキーやセッションIDを盗まれ、なりすまされる
- 本物そっくりの偽の入力欄を表示され、パスワードやカード番号を入力させられる
- 気づかないうちに別のサイトへ飛ばされる
1つめに出てくる2つの言葉を補っておきます。
- クッキー … ブラウザに保存される小さなデータ。サイトが「この人はさっきの人だ」と見分けるために使う
- セッションID … ログイン中の人を見分けるための番号。クッキーに入れて持たせることが多い
セッションIDを盗まれると、パスワードを知られていなくてもなりすまされます。 サイトはその番号を見て本人かどうかを判断しているので、番号さえあれば通ってしまうからです。
しかも命令が動くのは、利用者が信用している正規のサイトの画面の上です。アドレスバーには見慣れたサイトのアドレスが出ているので、利用者は疑いません。攻撃者のサイトへ誘い込むのではなく、信用されているサイトの中で動かす。そこが厄介な点です。
サイトの運営者から見ると、自社のデータが壊されるわけではないのに、利用者に被害を出してしまう。踏み台にされるという言い方がぴったりくる攻撃です。
対策:記号を、ただの文字として表示する
対策の考え方は、入力された文字を命令として読ませないことです。
画面に出すときに、札として使われる記号(< や > など)を「見た目は同じだが、札とは解釈されない書き方」に置き換えます。これがエスケープ処理(サニタイジング)です。
こうしておけば、投稿にどんな記号が混ざっていても、画面にはそのままの文字として表示されるだけで、スクリプトにはなりません。読む人には < が < のまま見えますが、ブラウザは札の始まりだとは受け取りません。
この処理は、画面に出す直前に行うのが基本です。受け取った時点で書き換えてしまうと、元のデータが何だったか分からなくなり、別の場所で使うときに困ることがあるためです。
合わせて問われる備えもあります。
| 対策 | 何をするか |
|---|---|
| エスケープ処理 | 札になる記号を、ただの文字として表示する。根本対策 |
| クッキーの HttpOnly 属性 | スクリプトからクッキーを読めなくし、盗まれにくくする |
| 入力値の検証 | 想定外の形式の入力を受け付けない。補助として |
| WAF | 怪しい通信を手前で遮る。保険であって根本対策の代わりではない |
HttpOnly は、クッキーに付ける印です。これが付いていると、スクリプトからはそのクッキーを読めなくなります。通信のときには使われるので、サイトの動きは変わりません。仮にスクリプトを動かされても、クッキーだけは持ち出せない、という備えです。
WAF(Web Application Firewall、ワフ)は、Webへの通信を手前で見て、怪しいものを遮る仕組みです。攻撃の形を見分けて止めるので、知らない形の攻撃は通ってしまいます。
名前の似ている攻撃と区別する
クロスサイトリクエストフォージェリ(CSRF、シーサーフ)という、名前のよく似た攻撃があります。
これは、ログイン中の利用者に、本人が意図していない操作を送信させる攻撃です。たとえば、ログインしたままの人に細工したページを踏ませて、本人が送ったように見える送金や退会の手続きを送らせる、という形です。
スクリプトを実行させるXSSとは、仕組みが別です。 試験では並べて出されるので、区別しておいてください。
試験ではこう出る
科目A(旧・午前)のセキュリティ分野で出ます。
多いのは、攻撃の説明を示して名前を選ばせる形と、対策として適切なものを選ばせる形です。SQLインジェクション・クロスサイトリクエストフォージェリ・セッションハイジャック(ログイン中の人の番号を乗っ取る攻撃)などと並べて、どれがどの攻撃の説明かを振り分けさせる問題が定番です。応用情報では、対策をどの段階で行うか(表示するとき・受け取るとき・通信するとき)まで踏み込みます。
見分けるコツは、誰が、どこで被害を受けるかを先に読むことです。
| 書いてあること | 答え |
|---|---|
| サーバのデータベースが狙われている | SQLインジェクション |
| 閲覧者のブラウザで何かが動いている | クロスサイトスクリプティング |
| 利用者が知らないうちに何かを送信させられている | クロスサイトリクエストフォージェリ |
攻撃名を丸暗記するより、この3点で振り分けるほうが確実です。
関連する用語
- SQLインジェクション
- 入力をそのまま扱うのが原因という点は同じ。ただし狙われるのはサーバのデータベース
- エスケープ処理
- 記号をただの文字として表示させる処理。この攻撃の基本的な対策
- セッションID
- ログイン中の利用者を見分けるための番号。盗まれるとなりすまされる
- クッキー
- ブラウザに保存される小さなデータ。セッションIDの保管によく使われる
- クロスサイトリクエストフォージェリ
- 利用者に意図しない操作を送信させる攻撃。名前が似ているが仕組みは別
- WAF
- Webへの通信を見て怪しいものを遮る仕組み。保険であって根本対策ではない
ミニクイズ
クロスサイトスクリプティングによって直接的な被害を受けるのは誰か、また被害が起こる場所はどこか。最も適切なものはどれか。
正解は 3番:脆弱なサイトを閲覧した利用者が、自分のブラウザ上で被害を受ける
この攻撃で命令が動くのは、脆弱なサイトを見に行った利用者のブラウザです。攻撃者が仕掛けるのはサイトのほうですが、そのサイト自体のデータが壊されるわけではなく、閲覧した人のクッキーやセッションIDが盗まれたり、偽の入力欄を表示されたりします。サイトは踏み台にされている、という位置づけです。サーバ(要求を受け取って応えを返す側の機械)上のデータベースが直接狙われるのはSQLインジェクションのほうです。また、命令が動くのは攻撃者のサイトではなく、あくまで信用されている正規のサイトの画面上なので、利用者は気づきにくくなります。
この分野をまとめて解く → セキュリティのミニテスト(全47問)
最終更新:2026-09-15