Webセキュリティ入門:HTTP・Cookie・脆弱性
HTTPヘッダーとは
この回でやること
HTTPヘッダーは付帯情報であり、同時に利用者が自由に書ける入力でもあります。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
HTTPヘッダーは、要求と返答に付く名前と値の組です。この回では、そこに置いてよい信頼の重さを、要求側と返答側で分けて見ます。
読み終えるころには、よく見るヘッダーの役割と、名前の扱いで事故になる2つの性質を説明できるようになります。
よく見るヘッダー
要求側に付くもの。
Hostどのホスト宛かCookie保持している値Authorization認証のための値User-Agent名乗っているブラウザRefererどこから来たか
返答側に付くもの。
Content-Type本文の種類Set-Cookie保存させたい値Cache-Control保存してよいかLocation転送先
要求ヘッダーは全部書き換えられる
ここが要です。要求のヘッダーは、送る側が好きな値を入れられます。
User-Agent に別のブラウザ名を書くのも、Referer に自社のURLを書くのも、コマンド1行でできます。ブラウザが自動で付ける値だから正しい、という保証はどこにもありません。
「自社サイトからの遷移だけ許可する」を Referer で判定すると、その値を書いて送るだけで通ります。名乗っている値と、確かめた事実は別ものです。
返答ヘッダーは守りに使える
逆に、返答側のヘッダーは運営者が決められるので、防御に使えます。
Content-Typeを正しく付けて、中身を別のものとして解釈させないCache-Control: no-storeで、他人の環境に残さないSet-Cookieに属性を付けて、扱いを制限する(後の回で扱います)
名前の扱いと重複
2つ、事故のもとになる性質があります。
大文字小文字は区別されません。 Authorization と authorization は同じヘッダーです。自分で名前を比較するときは、揃えてから比べます。片方だけを見る書き方をすると、もう片方で素通りします。
同じ名前が複数回届くことがあります。 前段に中継装置があると、そこで足されることもあります。「最初のものを見る」実装と「最後のものを見る」実装が経路上に混ざると、検査した値と使われる値が食い違います。
前段で付けたヘッダーを信じる作りにするなら、利用者が同じ名前を付けて送ってきたときに上書きされないかを確かめます。