レッスン 2-2
クロスサイトスクリプティング
エスケープの
利用者の
なぜ通るのか
会員の
ここで
クロスサイト
文字とタグが混ざる所
HTML では、< と >) が
悪意が<b>Ann</b>」と
エスケープの場所
防ぐ< や " のような
ただし、
| 置く場所 | 要る処理 |
|---|---|
| 本文 | & < > " ' を |
| 属性の値 | 引用符で |
| URL の中の値 | URL の |
1 か所で
CSRF との違い
次の
| XSS | CSRF | |
|---|---|---|
| 何が | 攻め手の | ブラウザが |
| 攻め手に | ページの | 応答は |
| 止める所 | 出力の | 要求が |
XSS が
脆いコードと直したコード
ラボのhtml と urllib.parse だけで
本文に置くとき
def card(name):return "<p>" + name + "</p>"from html import escape def card(name):return "<p>" + escape(name) + "</p>"脆い方に「<b>Ann</b>」をb の<b> に
属性に置くとき
from html import escape def field(name):v = escape(name, quote=False)return ('<input value="'+ v + '">')from html import escape def field(name):v = escape(name)return ('<input value="'+ v + '">')脆い方も
あだ名を「Ann "Bee" Lee」とvalue が" に
URL の中に置くとき
from html import escape def link(name):url = "/users?name=" + namereturn '<a href="' + escape(url) + '">'from html import escapefrom urllib.parse import quote def link(name):url = "/users?name=" + quote(name)return '<a href="' + escape(url) + '">'「Tom & Jerry」で& は & に& を & にname の
直した方は、先に quote で%26 など)、
もうhttp と https で
ブラウザの中で書き換えるとき
サーバーではなく、innerHTML にtextContent をtextContent は
ログでの見え方と検知
XSS は、
CSP (Content Security Policy、
csp-report path=/profiledirective=script-srcblocked=inline count=3この
| 見る物 | な |
|---|---|
| CSP の | ふだんの |
| 違反が | どの |
| コードの | innerHTML や |
コードの|safe や Markup() と、innerHTML への
直し方と、直ったことの確かめ方
自分の
- 作業用の
フォルダに 上の 3 つの 関数を 置き、名前「 <b>Ann</b>」、あだ名「 Ann "Bee" Lee」、名前 「Tom & Jerry」を 用意する - 脆い
関数の 出力を Python の HTMLParserで読み、 タグや 属性や URL の 値が 増える ことを 確かめる - 関数を
直した コードに 置き換える - 同じ
入力で、 タグも 属性も 増えず、 URL の nameが元の 名前に 戻る ことを 確かめる - 下の
試験を 足し、 直す前の コードに 戻すと 試験が 落ちる ことも 確かめる - 終わったら、
作業用の フォルダごと消す
def test_body_stays_text():tags, text = parse(card("<b>Ann</b>"))assert [t for t, _ in tags] == ["p"]assert text == "<b>Ann</b>" def test_attr_stays_one_value():tags, _ = parse(field('Ann "Bee" Lee'))assert tags[0][1] == [("value", 'Ann "Bee" Lee')]parse は、HTMLParser で
あわせて、HttpOnly を
関わる事例
CISA と
IPA の
確認クイズ
1 問目
入力の
- ア 山括弧を
置き換えたので、 どの 入力でも安全 - イ 引用符を
含む入力で 値が 途中で 閉じ、 別の 属性が 足される - ウ
属性の 中では、 HTML の エスケープは 要らない
答えと理由を見る
答え イ
属性の
2 問目
検索語を
- ア HTML の
エスケープだけをかける - イ URL の
決まりで 書き換えだけをかける - ウ URL の
決まりで 書き換えてから、 HTML の エスケープをかける
答えと理由を見る
答え ウ
ブラウザは
説明課題
次の
- エスケープの
場所を 間違えると 対策が 効かなくなる 例を 1 つ挙げ、 なぜ 効かないのか
模範解答を見る
URL の& は & に& へ戻す。戻った & は
一次資料
どれも
- Cross Site Scripting Prevention Cheat Sheet (OWASP、英語)。
本文、 属性、 URL など 場所ごとの エンコード、 属性を 引用符で 囲むこと、 innerHTMLよりtextContent - 安全な
ウェブサイトの 。作り方 1.5 クロスサイト・ スクリプティング (IPA、 日本語) 出力する すべての 要素への エスケープ、 属性を 二重引用符で 囲むこと、 httpとhttpsのURL だけを 許すこと、 HttpOnly - Secure by Design Alert Eliminating Cross-Site Scripting Vulnerabilities (CISA、英語)。
2024年9月18日の CISA と FBI の文書 - Content Security Policy Level 3 (W3C、英語)。
Content-Security-Policy-Report-Only で、 止めずに 違反を 知らせる仕組み - Cross-Site Request Forgery Prevention Cheat Sheet (OWASP、英語)。
XSS が あれば CSRF の 対策は 越えられること
次へ
次の