Webセキュリティ入門:HTTP・Cookie・脆弱性
リクエストボディとJSON
この回でやること
リクエストボディで送るJSONの形と、受け取る側が確かめるべきことを整理します。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
リクエストボディは、URLに載せずに送るデータの本体です。この回では、その形式と、受け取ったあとに何を確かめるのかを整理します。
読み終えるころには、届いたボディを使うまでの確認を、5つの段階で並べられるようになります。
主な形式
ボディの形式は Content-Type で示します。よく使うのは3つです。
| 形式 | 用途 |
|---|---|
application/json | APIのやり取り |
application/x-www-form-urlencoded | 素朴なフォーム送信 |
multipart/form-data | ファイルを含む送信 |
JSON はこう送られます。
JSON
{"itemId": 42, "quantity": 2, "note": "急ぎ"}読めることと正しいことは違う
ここが今回の要です。JSON として解釈できたことは、内容が妥当であることを何も保証しません。
解釈は通るが、内容として困るものはいくらでもあります。
{"quantity": -5}負の数{"quantity": "2"}数のつもりが文字列{"quantity": 99999999}桁が大きすぎる{"price": 1}送るはずのない項目
最後が特に重要です。値段や権限のように、サーバーが決めるべき値が入っていても、JSON としては何もおかしくありません。
受け取る項目を決めておく
届いたものを全部そのまま使う作りにすると、想定していない項目まで反映されます。使う項目を先に決めて、それ以外は捨てます。
確かめる順番
受け取ったら、順に確かめます。
- 解釈できるか。 壊れた JSON なら、そこで断る
- 項目がそろっているか。 必須のものが無ければ断る
- 型が合っているか。 数のはずが文字列なら断る
- 範囲に入っているか。 負の数、大きすぎる値、長すぎる文字列
- その人が指定してよい項目か。 値段や権限は無視して、サーバー側で決め直す
5番目は検証というより設計です。そもそも受け取らないのが一番確実です。
大きさの上限
ボディの大きさに上限を置きます。上限が無いと、巨大な本文を送りつけるだけで処理と記憶領域を使い切らせることができます。可用性の話がここにつながります。