見えるセキュリティ

XSSの防ぎ方

XSS PREVENTION

この概念とは?

XSSを防ぐには、外から受け取った値を、ブラウザに意図しないコードとして扱わせないことが大切です。文字として見せる場合と、HTMLの装飾を許可する場合では、必要な処理が変わります。ここでは、表示の目的と場所に合わせた対策の選び方を見ます。

まず「どこへ、何として表示したいか」を確かめます。文字表示、HTMLの装飾、リンク先を分けて考え、用途に合う対策を選びます。

THEME
web-vuln
KIND
defense
REVIEW
self-reviewed ·

表示したいものと、値を渡す場所を見比べながら、対策を選びます。

各STEPは対策を選ぶための比較です。すべての処理を、同じ入力へ順番に適用する意味ではありません。

入力元の例

  • URL
  • 投稿・保存データ
  • 受け取ったデータ

使い道から、対策を選ぶ

  • 文字を見せたい

    HTML本文に埋め込む/ブラウザ内で文字として渡す

    • 02HTML本文へ埋め込む
    • 03ブラウザ内で文字として渡す
  • HTMLの装飾を許可したい

    許可するHTMLを決める

    • 04許可ルールとサニタイズ
  • リンク先などに使いたい

    URL・属性の条件を確認する

    • 05属性・URL・コードの比較
06追加の防御で補うCSP・HttpOnly

STEP 01 / 6

表示の目的と場所を確かめる

STEP 1 / 6: 表示の目的と場所を確かめる

現在のSTEP 1STEP 2STEP 3STEP 4STEP 5STEP 6

外から受け取った値を使う前に、「文字を見せたいのか」「HTMLの装飾を許可したいのか」「リンク先などに使うのか」を確かめます。使い道が変われば、必要な対策も変わります。

技術的な詳細を見る

URL、投稿、保存データ、外部サービスからの応答などが入力元になります。保存済みであることだけを理由に、表示へ安全に使えるとは判断できません。入力元に加えて、値を使う先を確認します。この「使われる場所や解釈のされ方」を、出力文脈と呼びます。 長さや形式の入力チェックは役立ちますが、表示先に合う出力処理の代わりにはなりません。記号を一律に消す方法や、保存時の一度の処理だけで、あらゆる出力先を安全にできるとは考えません。

パネルの開閉ではSTEPは変わりません。

この概念の要点

  • 要点

    使う場所に合わせて選ぶ

    入力の出どころだけでなく、どこで、何として使うかを確認します。HTML本文、属性、URL、コードでは、必要な扱い方が違います。

  • 要点

    文字を見せるなら、文字として扱う

    HTML本文へ埋め込む場合は適切な出力エンコードを使い、ブラウザ内の普通の表示要素ではtextContentなどを選べます。これらを常に重ねて使うという意味ではありません。

  • 要点

    HTMLを許可するなら、ルールを決める

    装飾用のHTMLが必要な場合は、許可する機能を決めてサニタイズします。処理後の変更や使い回しにも注意し、利用するライブラリを更新します。

  • 要点

    追加防御の役割を分ける

    CSPはスクリプト等の制限、HttpOnlyはCookie値の直接アクセスの制限です。どちらも、危険な出力処理を修正する代わりにはなりません。

理解確認

ブラウザ内のJavaScriptで、利用者の入力を普通のdiv要素へ文字として表示します。HTMLの装飾は許可しません。表示処理として適切なのはどれですか?

参考資料

RELATED CONCEPTS