レッスン 2-4
認可の設計
認証は
URL の
なぜ通るのか
通販の/orders/1 です。
ログインは
認証と認可は別の問い
認証は
ログインの
番号は利用者の手の中にある
URL の
連番は
見る時だけ確かめる、が穴になる
よく
脆いコードと直したコード
ラボの
番号だけで取り出すか、持ち主と突き合わせるか
def get_order(db, user, order_id):sql = ("SELECT id, owner, item"" FROM orders WHERE id = ?")return db.execute(sql, (order_id,)).fetchone()def get_order(db, user, order_id):sql = ("SELECT id, owner, item"" FROM orders WHERE id = ?"" AND owner = ?")return db.execute(sql, (order_id, user)).fetchone()脆い方は user を
操作ごとに書くか、1 か所の関所を通すか
def cancel(db, user, order_id):db.execute("UPDATE orders SET st = 'cancel'"" WHERE id = ?", (order_id,))class NotFound(Exception):pass def owned(db, user, order_id):row = db.execute("SELECT owner FROM orders"" WHERE id = ?",(order_id,)).fetchone()if row is None or row[0] != user:raise NotFound(order_id) def cancel(db, user, order_id):owned(db, user, order_id)db.execute("UPDATE orders SET st = 'cancel'"" WHERE id = ?", (order_id,))直した方は、owned の
ログでの見え方と検知
脆い
127.0.0.1 alice GET /orders/1 200 alice127.0.0.1 alice GET /orders/2 200 bob127.0.0.1 alice GET /orders/3 200 carol直した
| 見る物 | な |
|---|---|
| 頼んだ | 成功した |
| 1 人が | 番号を |
| 403 と | CISA などは、 |
ACSC、
直し方と、直ったことの確かめ方
自分の
- 作業用の
フォルダに sqlite3 の データベースを 作り、 alice の 注文 1 と bob の 注文 2 を入れる - 脆い
get_orderにalice と 2 を 渡し、 bob の 注文が 返る ことを 確かめる - 脆い
cancelにalice と 2 を 渡し、 bob の 注文が 取り消される ことを 確かめる - 両方を
直した コードに 置き換え、 同じ 入力で 何も 返らず、 取り消しも 止まる ことを 確かめる - 下の
試験を 足し、 直す前の コードに 戻すと 試験が 落ちる ことも 確かめる - 終わったら、
作業用の フォルダごと消す
def test_alice_cannot_read_bob(db):assert get_order(db, "alice", 2) is Nonerow = get_order(db, "bob", 2)assert row[2] == "緑茶" def test_alice_cannot_cancel_bob(db):with pytest.raises(NotFound):cancel(db, "alice", 2)assert status(db, 2) == "open"試験は、
番号を
関わる事例
この
2023年7月27日、
作り手への
確認クイズ
1 問目
注文の
- ア 足りる。
UUID は 推測できないので、 他人の 注文には 届かない - イ 足りない。
番号が 漏れれば、 持ち主の 確かめが 無いので 同じように届く - ウ 足りる。
UUID なら、 記録に 残る 番号も 推測できない
答えと理由を見る
答え イ
UUID は
2 問目
詳細を
- ア 要らない。
ボタンは 本人の 注文に しか 出ていない - イ 要らない。
見る 時に 確かめているので、 番号は 本人の 物だと 分かっている - ウ 要る。
要求は 画面を 通らずに 直接送れるので、 操作ごとに 確かめる
答えと理由を見る
答え ウ
ボタンの
説明課題
次の
- な
ぜ認可は、 ログインの 時ではなく、 すべての 操作で 要るのか。 例を 1 つ挙げて
模範解答を見る
ログインで
一次資料
どれも
- Preventing Web Application Access Control Abuse (CISA、英語)。
2023年7月27日の ACSC、 CISA、 NSA の 共同の 注意喚起 AA23-208A。 IDOR の 説明、 既定で 拒むこと、 すべての 要求での 確かめ、 UUID の 注記、 404 と 403 と 総当たりの関係 - Authorization Cheat Sheet (OWASP、英語)。
認証と 認可の 区別、 既定で 拒否、 要求の たびの 確かめ、 推測されても 触れない ID、 認可の試験 - Insecure Direct Object Reference Prevention Cheat Sheet (OWASP、英語)。
アクセスの たびに 権限を 確かめる こと、 ランダムな ID は 重ねの 守りであること
次へ
次の