Webセキュリティ入門:HTTP・Cookie・脆弱性
HTTPリクエストの読み方
この回でやること
HTTPリクエストの実物を読みます。ブラウザがサーバーへ送っている文字列を、行ごとに分解します。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
HTTPリクエストは、ボタンを押したときにブラウザがサーバーへ送っているものです。この回では、その実物を行ごとに分解して読みます。
読み終えるころには、ブラウザが送る文字列を、1行目・ヘッダー・空行・ボディの4つに分けて読めるようになります。
中身はテキスト
ボタンを押したとき、ブラウザはこういう文字列を送っています。
http
POST /api/orders HTTP/1.1
Host: shop.example.com
Content-Type: application/json
Cookie: session=abc123
{"itemId":42,"quantity":2}構造は単純です。
- 1行目。何をしたいか(メソッド)、どこに対してか(パス)
- ヘッダー。付帯情報を名前と値の組で並べる
- 空行
- ボディ。送るデータ本体
誰が組み立てているか
いつもはブラウザが組み立てますが、組み立てるのはブラウザでなくてもかまいません。
この文字列さえ作れれば、コマンドひとつでも、自作のプログラムでも同じことができます。サーバーから見れば、どちらも区別が付きません。
画面は通り道のひとつでしかない
「その画面を出していないから、その要求は来ない」は成り立ちません。画面はあくまで要求を作る手段のひとつです。届く要求の側から考えます。
だから起きること
この性質から、いくつもの前提が崩れます。
- 入力欄の最大文字数を超えた値が届く
- 画面に出していない項目が付いてくる
- 押せないようにしたボタンの先の処理が呼ばれる
- 手順を飛ばして、途中の要求だけが届く
どれも特別な攻撃ではありません。文字列を作って送っただけです。
ヘッダーの重複と大文字小文字
細かい点ですが、事故になりやすい2つがあります。
名前の大文字小文字は区別されません。 Content-Type と content-type は同じものです。自分で比較を書くときは、揃えてから比べます。
同じ名前が複数回来ることがあります。 どれを採用するかは受け取る側の実装で違います。検査する場所と使う場所で採用の仕方が違うと、検査を通った値と実際に使う値がずれます。 これはクエリの重複と同じ形の落とし穴です。