見えるセキュリティ
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・コードの比較
STEP 01 / 6
表示の目的と場所を確かめる
STEP 1 / 6: 表示の目的と場所を確かめる
外から受け取った値を使う前に、「文字を見せたいのか」「HTMLの装飾を許可したいのか」「リンク先などに使うのか」を確かめます。使い道が変われば、必要な対策も変わります。
技術的な詳細を見る
URL、投稿、保存データ、外部サービスからの応答などが入力元になります。保存済みであることだけを理由に、表示へ安全に使えるとは判断できません。入力元に加えて、値を使う先を確認します。この「使われる場所や解釈のされ方」を、出力文脈と呼びます。 長さや形式の入力チェックは役立ちますが、表示先に合う出力処理の代わりにはなりません。記号を一律に消す方法や、保存時の一度の処理だけで、あらゆる出力先を安全にできるとは考えません。
この概念の要点
要点
使う場所に合わせて選ぶ
入力の出どころだけでなく、どこで、何として使うかを確認します。HTML本文、属性、URL、コードでは、必要な扱い方が違います。
要点
文字を見せるなら、文字として扱う
HTML本文へ埋め込む場合は適切な出力エンコードを使い、ブラウザ内の普通の表示要素ではtextContentなどを選べます。これらを常に重ねて使うという意味ではありません。
要点
HTMLを許可するなら、ルールを決める
装飾用のHTMLが必要な場合は、許可する機能を決めてサニタイズします。処理後の変更や使い回しにも注意し、利用するライブラリを更新します。
要点
追加防御の役割を分ける
CSPはスクリプト等の制限、HttpOnlyはCookie値の直接アクセスの制限です。どちらも、危険な出力処理を修正する代わりにはなりません。
理解確認
参考資料
- OWASPCross Site Scripting Prevention Cheat Sheet
Framework Security、Output Encoding、HTML Attribute Contexts、URL Contexts、Dangerous Contexts、HTML Sanitization
- 参考資料Cross-site scripting (XSS)
Client and server XSS、Output encoding/Document contexts、Sanitization
- 参考資料The Django template language(Django 5.2)
Automatic HTML escaping、How to turn it off
- 参考資料Node.textContent
Value、Differences from innerHTML
- 参考資料DOM Standard/Node.textContent
§4.4 Node、textContent setter、set text content、string replace all
- 参考資料DOMPurify公式README
What does it do?、Is there any foot-gun potential?、Control our allow-lists and block-lists
- 参考資料javascript: URLs
冒頭の警告、Description
- 参考資料Content Security Policy (CSP)
XSS and resource loading、Strict CSP、Testing your policy
- 参考資料Set-Cookie/HttpOnly
Attributes → HttpOnly
- 参考資料Input validation
Input validation and security
- 参考資料Trusted Types API
Concepts and usage、Using a CSP to enforce trusted types