XSSとは
XSSは、攻撃者が用意したスクリプトを、別の利用者が閲覧するページ上で実行させる攻撃です。入力フォームやURLのパラメータなど、利用者の入力が画面に表示される箇所が狙われやすくなります。
もし対策が不十分だと、入力されたスクリプトがそのままページに埋め込まれ、閲覧者のブラウザで実行されてしまいます。
どんな被害につながるか
XSSが成立すると、閲覧者のブラウザ上で攻撃者の意図したスクリプトが動きます。これにより、画面の改ざんや、利用者になりすました操作などにつながる恐れがあります。
とりわけ多くの人が閲覧するページで起きると、被害が広がりやすくなります。だからこそ、入力を扱うすべての画面で注意が必要です。
実務ではどこで関係する?
XSSは言葉の意味だけ覚えても、HTML共有の判断にはつながりません。実務では「表示に関係する話か」「検索に関係する話か」「アクセス制限に関係する話か」を分けて考えると整理しやすくなります。
XSS(クロスサイトスクリプティング)について迷ったら、相手が安全に開けるか、検索に出してよいか、ブラウザや環境差で壊れないかを順番に確認します。用語理解は、その判断を早くするための道具として使います。手順が決まったら、HTML/ZIPをアップロードして共有URLを発行し、相手に確認してほしい観点と期限を添えて送ります。
- 表示の話: HTML/CSS/JS、パス、ブラウザ互換性を確認する
- 検索の話: noindex、canonical、sitemap、robots.txtの役割を分ける
- 制限の話: URL共有、パスワード、メール認証、会社ドメイン認証を混同しない
- 運用の話: 期限、差し替え、削除、共有メッセージまで決める
XSSの主な種類
XSSはスクリプトが混入する経路によっていくつかに分けられます。代表的な種類を押さえておくと、対策の見当をつけやすくなります。
- 反射型:リクエストに含まれた値が、そのまま応答ページに反映されて実行される
- 格納型:投稿内容などがサーバーに保存され、閲覧した人の画面で実行される
- DOMベース:サーバーを介さず、ブラウザ側のスクリプト処理の中で混入する
基本的な対策の考え方
XSS対策の基本は、利用者の入力を画面に出すときに、スクリプトとして解釈されないよう適切に処理することです。表示する文脈に応じたエスケープが重要になります。
また、利用者の入力をそのまま信用しない姿勢が前提です。入力の検証や、安全なテンプレートの仕組みを使うことも有効な手立てになります。
エスケープと文脈
エスケープとは、特別な意味を持つ文字を、ただの文字として表示されるよう変換することです。同じ入力でも、本文として出すのか、属性として出すのかで適切な処理が変わります。
つまり「どこに出力するか」を意識することが大切です。文脈に合わない処理だと、対策したつもりでも抜けが生じることがあります。
確認用ページを安全に共有するには
対策が効いているかを検証する際は、検証用のページを関係者だけに見せて確認してもらうのが安心です。誰でも見られる状態だと、検証用のページが意図せず広まる恐れがあります。
そうした一時的な共有には、ギガサイト便のように認証付きの一時URLを発行でき、公開期限も設定できるサービスが向いています。関係者以外に見せたくない場合は、URLのみではなくパスワードやメール認証などを併用すると安心です。
よくある質問
XSSとCSRFは同じものですか?
別の攻撃です。XSSは悪意のあるスクリプトを実行させる攻撃、CSRFは利用者になりすまして意図しない操作をさせる攻撃を指します。
エスケープすればXSSは完全に防げますか?
出力する文脈に応じた適切なエスケープは基本対策ですが、文脈の取り違えなどで抜けが生じることもあります。入力検証や安全な仕組みの併用が望まれます。
格納型と反射型はどちらが危険ですか?
一概には言えませんが、格納型は保存された内容が多くの閲覧者に影響しうるため、被害が広がりやすい傾向があります。いずれも適切な対策が必要です。
DOMベースのXSSとは何ですか?
サーバーを介さず、ブラウザ側のスクリプト処理の中で危険な値が扱われることで起きるXSSです。クライアント側のコードにも注意が必要です。
実務ではどこで関係する?はHTML共有で必ず理解しておく必要がありますか?
細かな仕様を暗記する必要はありません。ただし、検索に出るか、閲覧者を制限できるか、表示が崩れないかに関わる用語は、共有前の判断材料として押さえておくと安全です。