APIセキュリティ入門:REST・認証・認可
BOLAの見つけ方 IDを差し替えて確かめる
この回でやること
自分で登録したふたつのアカウントを使い、片方の注文番号をもう片方のトークンで叩いて、オブジェクト単位の認可の抜けを見つける手順です。200と404と403の読み分けを扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
BOLA(Broken Object Level Authorization)は、1件ごとの持ち主の照合が抜けている状態です。この回は、その抜けを自分の手で見つける手順を扱います。
読み終えるころには、返ってきた200と403と404を、それぞれ何が起きた印なのか読み分けられるようになります。
自分のアカウントをふたつ使う
練習用の環境で、自分が登録したふたつのアカウントtanakaとsatoを用意します。どちらも自分のものです。手順は次の3つです。
tanakaでログインし、自分の注文でGET /api/orders/1043が200で返るのを見る。これが基準satoでログインし、satoの注文番号1044を控えるtanakaのトークンに戻し、satoの番号1044を叩く
http
GET /api/orders/1044
Authorization: Bearer <tanaka のトークン>なぜふたつ要るかというと、片方だけでは基準と対象を並べられないからです。両方が自分の持ち物なので、他人に迷惑をかけずに確かめられます。
200と404と403を読み分ける
3で返るステータスで判断します。読み方は次のとおりです。
プレーンテキスト
200 + sato の中身 → 所有を見ていない。BOLA が成立している
403 → 所有を見て拒んだ。ただし存在することは漏れる
404 → 拒み、かつ存在も隠した。無い番号と同じ応答200で他人の中身が返れば、そのエンドポイントは持ち主を照合していません。403は拒んではいますが、「あなたのではない」と返る以上、その番号のオブジェクトが在ることは相手に伝わります。404は、持ち物でない番号を存在しない番号と同じに扱うので、最も情報が漏れません。
その1本が所有を見ている、まではそのとおりです。ただしAPIは機械で大量に叩けるので、番号が連番なら端から総当たりして、自分の持ち物との反応の差から在り処を推し量る余地は残ります。番号の推測しにくさは、所有の照合とは別に用意する話です。
見つけたら、どう直すか
200が返った時点で、そのエンドポイントは所有の照合が抜けています。直す向きは前回のとおりで、引いた行のownerとトークンの利用者を突き合わせ、一致しなければ404を返すことです。1本ずつのif文で散らすのでなく1か所に寄せる型は、この章の後半で組み立てます。確かめるのは自分が権限を持つ練習用の環境だけにし、他人のサイトや他人の番号では絶対に試しません。