Webセキュリティ入門:HTTP・Cookie・脆弱性
クエリパラメータは書き換えられる
この回でやること
クエリパラメータはURLに付く条件の指定です。そこを書き換えられたときに何が起きるかを見ます。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
クエリパラメータは、URLの ? の後ろに付く条件の指定です。この回では、その値が書き換えられたときに何が起きるかを見ます。
読み終えるころには、クエリに置いてよい値と置いてはいけない値を分けられるようになります。
形
? の後ろに、名前と値の組を & でつなぎます。
プレーンテキスト
/items?category=book&sort=price&page=2用途はだいたい次のどれかです。絞り込み、並び替え、ページ送り、表示の切り替え。
書き換えられる前提で考える
利用者はアドレス欄で自由に編集できます。だから次のような値が届きます。
page=-1やpage=99999999のような範囲外sort=; DROP TABLEのような文字列- 同じ名前が2回(
page=1&page=2) - そもそも項目が無い
どれも「ありえない」ではなく「必ず来る」と考えます。 想定外の値で落ちること自体が、内部の情報を出すきっかけになります。
置いてはいけないもの
クエリはURLの一部なので、履歴、ログ、参照元情報として残ります。ここから決まります。
| 置いてよい | 置いてはいけない |
|---|---|
| 絞り込み条件 | 合言葉やAPIの鍵 |
| 並び順、ページ番号 | セッションを識別する値 |
| 表示の切り替え | 個人を特定できる情報 |
権限をクエリで決めない
?role=admin や ?userId=123 を見て権限を決めると、値を書き換えるだけで他人になれます。誰であるかはセッションから引き、クエリからは引きません。
同じ名前が2回来たとき
見落とされやすい点です。page=1&page=2 が届いたとき、どちらを採用するかは言語やフレームワークで違います。最初、最後、配列として全部、と分かれます。
検査する場所と使う場所で採用の仕方が違うと、検査を通った値と実際に使う値がずれます。 挙動を確かめてから、片方に揃えます。