追加、削除できる (API6:2019 Mass Assignment) Mass Assignmentの例: id:153の⼈が⾃分をadminに変更できてしまっている︕︕ 対策 ü オブジェクトを公開する時に、公開するオブジェクトのプロパティにユーザーがアクセスできる 必要があるかどうかを常に確認する ü 要件に従って返すプロパティを必要最⼩限にする ü クライアントが更新する必要があるオブジェクトのプロパティのみを変更できるように制限する 実装 POST /update {name:名無し,admin:true} {id:153,name:名無 し,admin=true} id:153, name:名無し admin: false
ü ⽂字列の最⼤⻑、配列内の要素の最⼤数、アップロードファイルの最⼤サイズなど、 受け取る全てのパラメータやペイロードの最⼤値を定義・適⽤する ü 定義された時間内でクライアントがAPIを実⾏できる頻度を制限するレート制限 (Rate Limit)を導⼊する ü 特に返すレコード数を制限するような処理に関しては、リクエストのパラメータを サーバーサイドで適切に検証する 設計 POST /upload POST /upload POST /upload
ü API環境(本番、ステージング、テスト、開発)、ホストへネットワークアクセスできる⼈ (パブリック、内部、パートナー)、APIバージョンなどに関してドキュメント化する ü OpenAPIなどオープンスタンダードを採⽤し、ドキュメントの⾃動⽣成をする ü 本番環境以外のAPIで本番データを使⽤することを避ける 運⽤? POST /v1/password/reset POST /beta/password/reset POST /v1/password/reset POST /v1/password/reset POST /v1/password/reset {status:429, message: “too many, rate limit!”} POST /beta/password/reset POST /beta/password/reset POST /beta/password/reset {status:200, message: “success”} V1本番稼働 ベータ版
対策 ü APIで受け取ったデータを使⽤する前に検証する ü レスポンスを処理するリソース制限・タイムアウト制限をする ü リダイレクトする可能性がある場合は許可リストを使⽤し、盲⽬的にリダイレクトしない ü APIの通信が安全な通信チャネル(TLS)上で⾏われていることを確認する 実装 4 ⃣ { nam e: ‘; drop db; --’} 1⃣ POST /register { name: ‘; drop db; --’} 3rd Party 2⃣ GET /service_list 3 ⃣ GET