名詞解釋

IDOR 是什麼:改寫 ID 就會暴露他人資料的漏洞

IDOR(Insecure Direct Object Reference/存取控制缺陷)是只要改寫 URL 或參數中的 ID,就能看到他人資料的漏洞。圖解原理,並說明主要防禦:在伺服器端每次確認該使用者是否有權查看該物件。

發布於 2026-06-10 更新於 2026-10-06 閱讀時間 2 分鐘
本頁內容

IDOR(存取控制缺陷)是指把 URL 裡的 id=124 改成 125,就會顯示出他人發票的漏洞。本文講解其原理與可靠的防範方法(不會寫出攻擊步驟)。

為什麼會發生

明明「認證(你是誰)」已經通過,卻缺了「授權(這個人是否可以操作它)」時就會發生。認證與授權是兩回事,能登入並不等於可以查看那份資料。

常見的疏漏後果
登入後就直接信任 ID改成他人的 ID 就能存取成功
誤以為「介面上不顯示=安全」直接呼叫 API 時不會被擋下
建立/更新/刪除沒有權限校驗不僅能查看,還能竄改、刪除

為什麼會成立(原理)

使用者 A 登入 → 自己的發票 /invoice?id=124
把 id 改成 125(使用者 B 的)
↓ 伺服器端只看到「125 是存在的」
因為沒有擁有者校驗,於是顯示出了他人的發票
只看 ID 的「形式」而不確認擁有者,那麼僅靠把自己的 ID 改成他人的 ID 就能通過。

ID 不只出現在 URL 的 ?id= 中。API 路徑(/api/orders/125)、JSON 本文("userId": 125)、檔案下載 URL 與表單的隱藏欄位,都需要同樣的檢查——凡是由使用者送來的值決定要操作哪個物件的地方都是。

相關用語

IDOR 是存取控制缺陷的一種形式。它有好幾個名稱,也容易與鄰近的概念混淆。

用語缺少的是什麼例子
IDOR針對每個物件的擁有者與權限檢查使用者 A 改了 ID 就看到使用者 B 的發票
BOLA與 IDOR 相同(OWASP API Security 的名稱)API 的 /orders/{id} 回傳了別人的訂單
功能層級授權缺陷針對每個功能的權限檢查一般使用者能呼叫管理員專用的 API
認證缺陷「你是誰」的檢查本身不登入也能呼叫 API

在 OWASP Top 10 中,存取控制缺陷(A01)在 2025 年版與 2021 年版一樣排名第一。在以 API 為對象的 OWASP API Security Top 10(2023)中,BOLA 同樣排名第一(API1:2023)。

實際案例:登入後能看到他人的資料

本站介紹過的兩起公部門案例,官方都歸因於系統更新時引入的缺陷,但結果與授權缺陷的形態相同:已登入的使用者能觸及不屬於自己的資料。

  • 英國 Companies House(2026 年 3 月):登入 WebFiling 的使用者,透過特定操作可能看到其他公司董事的住家地址等資訊,技術上也可能進行未經授權的申報。該機構表示這是 2025 年 10 月系統更新所引入的缺陷,而非外部攻擊 → 詳細解說(英文)
  • 日本國稅廳 e-Tax(2026 年 9 月):「我的頁面」更新造成的缺陷,讓其他使用者能查看 79 人的贈與稅申報書等文件 → 詳細解說(英文)

兩起案例中,登入檢查都正常運作。缺少的是「這個使用者是否可以操作這個物件」。而且兩起都發生在變更之後。即使原本做對了,新增功能時也可能失去檢查,所以每次都會執行的自動化測試很有價值。

防禦:在伺服器端每次確認「擁有者與權限」

1

針對每個物件校驗擁有者與權限(最重要)

在回傳/變更資料的緊前一刻,必須在伺服器端校驗「目前登入的使用者 ID,是否為該物件的擁有者、是否擁有操作權限」。不滿足則拒絕。

2

預設拒絕(deny by default)

新的端點應以「除明確許可的條件外一律拒絕」為初始狀態,讓漏加校驗時倒向「拒絕」一側,而非「放行」一側。

3

只查詢「屬於自己的」物件

在查詢語句本身中就帶上擁有者條件(例如:使用者 ID=本人 來篩選)。統一走全應用程式通用的授權輔助函式,杜絕各處的遺漏。

4

不要把介面控制誤當成防禦

隱藏/不顯示按鈕屬於 UX,而非防禦。要以「API 會被直接呼叫」為前提,只在伺服器端做判斷。隨機 ID 只能作為輔助。

如何檢查自己的 App

只在你自己開發或管理的 App 中進行。在他人的服務上嘗試,可能構成未經授權的存取。

  1. 建立測試使用者 A 與 B,各給一筆資料(訂單、檔案等)
  2. 以 A 登入,用指向 B 那筆資料的 ID 呼叫查看、更新與刪除的 API。不經由介面,而是用開發人員工具或 API 用戶端直接呼叫
  3. 確認每個請求都以 403 或 404 被拒絕。也要確認列表端點不會包含 B 的資料
  4. 把這些變成自動化測試,每新增一個端點就加上同樣的測試

OWASP API Security Top 10 同樣建議撰寫評估授權機制的測試,並且不要部署會讓這些測試失敗的變更。

本站的觀點:容易被忽略但影響很大,用自動化測試來檢查

IDOR 在技術上很樸素,連程式碼審查也容易漏看。然而「一次點擊就能看到他人全部個人資訊」這類危害非常嚴重。正因如此,加入「用另一個使用者去存取他人的 ID,必須回傳 403」的自動化測試才是實際可行的做法。本站堅持「不靠用戶端的外觀來防守/只在伺服器端做判斷」的原則。授權是「靠機制每次都生效」的東西,關鍵在於不依賴人的注意力。

出處(一手資料)

  • OWASP Top 10:2025, "A01 Broken Access Control" — top10.owasp.org(排名;不安全的直接物件參照的例子)
  • 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 與國稅廳的公告)列在各案例的解說中

接下來閱讀

分類編號

CWE 對造成漏洞的弱點類型進行分類,MITRE ATT&CK 對攻擊者的技術進行分類。兩者皆由 MITRE 維護,廣泛用於標註漏洞資訊與偵測規則。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QIDOR 會發生什麼?
A

已登入的使用者,僅靠把 URL 或 API 中的 ID(如 ?id=124)改成另一個值,就能查看、修改、刪除他人的發票、訂單、個人資訊、檔案等。它是 OWASP 中最常見的問題類別(存取控制缺陷)的代表,可怕之處在於無需任何特殊工具就能發生。

Q最主要的防禦是什麼?
A

就是「在伺服器端每次確認『目前登入的這個使用者,是否可以操作該物件』」。即使 ID 形式正確,也必須校驗它是否為本人所有、是否擁有權限,不滿足則拒絕(預設拒絕)。絕不能只依賴用戶端的介面控制。

Q把 ID 改成 UUID 或隨機值就能防住嗎?
A

那只是「讓它更難猜」,並不能解決問題。一旦 ID 被洩漏或被分享出去,請求照樣會成功。隨機化只能作為輔助,主要的防禦一定是伺服器端的擁有者與權限校驗。

QIDOR 和 BOLA 有什麼不同?
A

兩者描述的是同一個問題。IDOR 是 Web 應用長久以來的名稱;BOLA(Broken Object Level Authorization,物件層級授權缺陷)是 OWASP API Security Top 10 使用的名稱,在 2023 年版中排名第一(API1:2023)。兩者都是指缺少針對每個物件的授權檢查。

Q怎麼測試自己的 App 有沒有 IDOR?
A

在自己的 App 中建立兩個測試使用者 A 與 B。以 A 登入,用 ID 請求 B 的資料進行查看、更新與刪除,確認每個請求都被拒絕(403 或 404)。不要經由介面,而是直接呼叫 API,並把這項檢查保留為自動化測試。

QIDOR 在 OWASP Top 10 中屬於哪一類?
A

屬於 A01「存取控制缺陷(Broken Access Control)」。它在 2021 年版與 2025 年版都排名第一,OWASP 把「只要提供唯一識別碼就能查看或編輯他人帳號(不安全的直接物件參照)」列為例子。