よろずやIT
用語辞典

XSS(クロスサイトスクリプティング)とは?仕組みと対策を図解

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

用語辞典のイラスト

結論: **XSS(クロスサイトスクリプティング)**は、Webサイトの弱点を使い、そのサイトを見に来た他の利用者のブラウザで、不正なスクリプトを動かす攻撃です。原因は、入力された文字を、そのまま画面に出力してしまうこと。対策の基本は、出力する時のエスケープで、これに、CSPやCookieの設定などを重ねます。

XSSとは

XSSは、Cross-Site Scripting(クロスサイト・スクリプティング)の略です。掲示板、コメント欄、検索結果の画面など、入力した内容が、画面に表示される場所で起こりえます。

攻撃者が不正なスクリプトを投稿し、他の利用者のブラウザで動くまでの流れを示した図解

流れは、次のとおりです。

  1. 攻撃者が、不正なスクリプトを、コメント欄などに入力する
  2. サイトの対策が不十分で、そのスクリプトが、そのままページに含まれる
  3. 他の利用者が、そのページを開く
  4. 利用者のブラウザで、スクリプトが実行される

スクリプトは、そのサイトの中で動くものとして、ブラウザに扱われます。そのため、サイトの利用者として、できることが、悪用されます。

起こりうる被害

被害 内容
ログイン情報の窃取 Cookieなどを盗まれ、利用者になりすまされる(Cookieとは、セッションとは)
偽の入力欄の表示 本物そっくりの入力欄を出し、パスワードなどを入力させる
表示の改ざん ページの内容を書き換え、偽の情報や、不審なリンクを見せる
利用者の操作の代行 利用者の権限で、投稿や設定の変更をされる

被害を受けるのは、サイトの利用者です。ただし、サイトの運営者も、信用の低下や、対応の負担という影響を受けます。

XSSの3つの種類

種類 内容
反射型 入力した内容が、その場で、画面に反映される。不審なリンクを開かせて、実行させる
格納型(蓄積型) 入力した内容が、サイトに保存され、ページを開いた人すべてに、影響する
DOMベース型 サーバーを通さず、ブラウザ側のスクリプトが、危険な書き換えをして起こる

格納型は、ページを開くだけで、被害が広がりやすいため、特に注意が必要です。CMSやツールの脆弱性情報でも、格納型XSSは、よく報告される種類の1つです。

SQLインジェクションとの違い

XSS SQLインジェクション
狙うもの サイトを見る利用者のブラウザ サイトのデータベース
不正なものが動く場所 利用者の端末(ブラウザ) サーバー側
共通点 入力されたデータが、命令として扱われてしまう 同左

SQLインジェクションの仕組みは、SQLインジェクションとはで解説しています。

対策:出力する時に「ただの文字」にする

エスケープなしでは命令として実行され、エスケープありではただの文字として表示される違いを示した図解

① 出力時のエスケープ(基本)

特殊な文字を、「ただの文字」に変換してから、画面に出力します。

元の文字 変換後
< <
> >
& &
" "

出力する場所(HTMLの中、属性の中、JavaScriptの中、URLの中)によって、必要な変換が違います。場所に合った方法を使います。

② フレームワークの自動エスケープを、切らない

ReactやVueなどは、標準の書き方で、自動的にエスケープします。HTMLをそのまま出力する機能(ReactのdangerouslySetInnerHTML、Vueのv-htmlなど)は、安全が確認できた文字列だけに使います。

③ HTMLを許可する場合は、専用の部品を使う

リッチテキストのように、一部のHTMLを許可したい場合は、自作の処理ではなく、サニタイズ用の、実績のあるライブラリを使います。

④ 被害を小さくする、追加の対策

対策 内容
CSP(コンテンツセキュリティポリシー) 実行してよいスクリプトの出どころを、ブラウザに指定する
Cookieの属性(HttpOnly・Secure・SameSite) スクリプトからCookieを読み取れないようにするなど
入力チェック 形式を確認する補助。それだけでは不十分
WAF 既知の攻撃パターンを、手前で止める補助(WAFとは)
部品の更新 使っているソフトやプラグインの、脆弱性の修正を適用する

入力チェックだけに頼ると、漏れが出やすくなります。出力時のエスケープを主役にして、他の対策を重ねます。

利用者ができる備え

利用者は、サイトの弱点を、直接直せません。それでも、次の備えで、被害を小さくできます。

まとめ

関連記事:SQLインジェクションとは、SQLインジェクション対策、WAFとは、Cookieとは、脆弱性とは

あわせて読みたい:CSRF(クロスサイトリクエストフォージェリ)とは

PRフロントエンド開発のためのセキュリティ入門 知らなかったでは済まされない脆弱性対策の必須知識 【電子書籍】[ 平野昌士 ]

フロントエンド開発のためのセキュリティ入門 知らなかったでは済まされない脆弱性対策の必須知識 【電子書籍】[ 平野昌士 ]

¥2,970

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.XSSとSQLインジェクションは、何が違いますか?

A.狙う場所が違います。SQLインジェクションは、サイトの『データベース』を狙います。XSSは、サイトを見に来た『他の利用者のブラウザ』を狙います。どちらも、入力されたデータを、命令として扱ってしまう点が、共通しています。

Q.XSSの『クロスサイト』とは、どういう意味ですか?

A.もともとは、別のサイトから来たスクリプトが、対象のサイトの中で動く、という意味合いの名前です。略称が『XSS』なのは、『CSS(スタイルシート)』と区別するためとされています。

Q.利用者が、XSSを防ぐ方法はありますか?

A.サイトの弱点そのものは、利用者には直せません。ただし、不審なリンクを開かない、ブラウザを最新にする、重要なサービスには、多要素認証を設定する、といった備えで、被害を小さくできます。

Q.入力欄で、『<』や『>』を使えなくすれば、防げますか?

A.それだけでは、不十分です。入力を制限する方法は、漏れが出やすく、正当な入力も止めてしまいます。根本的な対策は、画面に出力する時に、特殊な文字を『ただの文字』に変換する、エスケープです。

Q.ReactやVueを使えば、XSSは起きませんか?

A.標準の書き方では、自動でエスケープされるため、起きにくくなります。ただし、HTMLをそのまま出力する機能(ReactのdangerouslySetInnerHTML、Vueのv-htmlなど)を、安全でない文字列に使うと、XSSの原因になります。

関連記事

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。