URLの id=124 を 125 に変えただけで他人の請求書が表示されてしまう脆弱性が、IDOR(アクセス制御不備)です。仕組みと確実な防ぎ方を解説します(攻撃手順は載せません)。
なぜ起きるか
「認証(誰か)」は通っているのに、「認可(その人がこれを操作してよいか)」が抜けていると発生します。認証と認可は別物で、ログインできること=そのデータを見てよいこと、ではありません。
| よくある抜け | 結果 |
|---|---|
| ログイン後はIDをそのまま信用 | 他人のIDに書き換えるだけでアクセスできる |
| 画面に出さない=安全と誤解 | APIを直接呼び出されると防げない |
| 作成/更新/削除に権限チェック無し | 閲覧だけでなく改ざん・削除まで可能 |
なぜ成立するか(仕組み)
IDはURLの ?id= だけに現れるわけではありません。APIのパス(/api/orders/125)、JSONの本文("userId": 125)、ファイルのダウンロードURL、隠しフィールドなど、利用者が送ってくる値で対象を選んでいる場所はすべて同じ確認が必要です。
似た言葉との違い
IDORは「アクセス制御の不備」の中の一つの形です。呼び方が複数あり、隣の問題と混同されやすいので並べます。
| 用語 | 何が抜けているか | 例 |
|---|---|---|
| IDOR | 対象ごとの所有者・権限の確認 | 利用者Aが、IDを変えて利用者Bの請求書を見る |
| BOLA | IDORと同じ(OWASP APIセキュリティでの呼び方) | APIの /orders/{id} で他人の注文を取れる |
| 機能レベルの認可不備 | 機能ごとの権限の確認 | 一般利用者が管理者用のAPIを呼べる |
| 認証の不備 | 「誰か」の確認そのもの | ログインせずにAPIを呼べる |
OWASP Top 10 では、アクセス制御の不備(A01)が2021年版に続き2025年版でも1位です。APIに絞った OWASP API Security Top 10(2023年版)でも、BOLAが1位(API1:2023)に置かれています。
具体例:ログイン後に他人のデータが見えた事例
当サイトで扱った公的機関の事例には、原因がシステム更新時の不具合と公表されているものの、結果が「ログインした利用者が、他人のデータを扱えた」という認可の不備と同じ形になったものがあります。
- 英国の会社登記所 Companies House(2026年3月):WebFiling にログインした利用者が、特定の操作をすると他社の取締役の自宅住所などを見られる可能性があり、同意のない届け出も技術的には可能だった。同機関は外部からの攻撃ではなく、2025年10月のシステム更新で入った不具合が原因としている → 詳しい解説
- 国税庁 e-Tax(2026年9月):マイページの改修で生じた不具合により、79人分の贈与税申告書などが本人以外の利用者から閲覧できる状態だった → 詳しい解説
どちらも、ログインの確認は機能していました。抜けていたのは「その利用者が、この対象を扱ってよいか」の確認です。そして、どちらも改修の後に起きています。一度正しく作っても、機能を足したときに確認が外れることがあるため、自動テストで毎回確かめる意味があります。
防御:サーバー側で「所有者・権限」を毎回確認
対象ごとに所有者・権限をチェック(最重要)
データを返す/変更する直前に、「ログイン中の利用者IDが、その対象の所有者か・操作権限を持つか」をサーバー側で必ず照合。満たさなければ拒否。
既定で拒否(deny by default)
新しいエンドポイントは「明示的に許可した条件以外すべて拒否」を初期状態に。チェックを付け忘れても、アクセスが許可されてしまわないようにする。
“自分の物”だけを問い合わせる
クエリ自体に所有者条件を含める(例:利用者ID=本人 で絞る)。アプリ全体で共通の認可ヘルパに通し、各所での書き忘れを無くす。
画面制御を防御と勘違いしない
ボタンを隠す/出さないはUXであって防御ではない。APIは直接呼び出される前提で、サーバー側でだけ判断する。ランダムIDは補助に留める。
自分のアプリで確認する方法
自分が開発・管理するアプリで、次の手順で確かめます。他人のサービスで試すのは不正アクセスになり得るので、必ず自分の環境で行います。
- テスト用の利用者AとBを作り、それぞれにデータ(注文・ファイルなど)を1件ずつ作る
- Aでログインした状態で、Bのデータを指すIDで「閲覧・更新・削除」の各APIを呼ぶ。画面ではなく、開発者ツールやAPIクライアントから直接呼ぶ
- すべて403か404で拒否されることを確かめる。一覧APIの結果にBのデータが混ざらないことも見る
- この確認を自動テストにし、新しいエンドポイントを足したら同じテストを追加する
OWASP の API Security Top 10 も、認可の仕組みを評価するテストを書き、そのテストが失敗する変更はデプロイしないことを勧めています。
当サイトの視点:目立たないが被害は大きい。自動テストで確認する
IDORは技術的に地味で、コードレビューでも見落とされがちです。しかし「ワンクリックで他人の個人情報が全件見える」ような被害規模は最大級です。だからこそ、「別ユーザーで他人のIDにアクセスしたら403になるか」を自動テストに固定化するのが実戦的です。当サイトは「クライアント側の見た目で守らない/サーバー側でだけ判断する」を原則にしています。認可は仕組みとして毎回確実に実行されるようにするもので、人の注意力に頼らないことが大切です。
出典(一次情報)
- OWASP Top 10:2025「A01 Broken Access Control」 — top10.owasp.org(順位、insecure direct object references の例)
- OWASP API Security Top 10 2023「API1:2023 Broken Object Level Authorization」 — api-security.owasp.org(防ぎ方、テストの推奨)
- MITRE CWE-639: Authorization Bypass Through User-Controlled Key — cwe.mitre.org
- 事例の出典は、各事例の解説記事(Companies House・国税庁の公表)に掲載しています
次に読む
- 基礎:認証と認可の違い(ログイン=認可ではない。IDOR はこの「認可の欠落」の一形態)
- 事例:Companies House の WebFiling 不具合 / e-Tax で他人の贈与税申告書が閲覧可能に
- 用語:CSRF とは(ログイン状態を悪用される攻撃) / OWASP Top 10 とは / セッション固定とは
- 入門:セキュリティ超入門 / 無料セキュリティツール