IDOR 與權限繞過
什麼是 IDOR?
IDOR (Insecure Direct Object Reference) 發生在 API 直接使用使用者提供的 ID 而沒有檢查權限。
攻擊範例
GET /api/orders/123 ← 使用者的訂單 ✅
GET /api/orders/456 ← 修改 ID 就能看到別人的訂單 ❌
Vibe Prompt
「幫我修復這個 IDOR 漏洞:在查詢訂單前先驗證使用者是否擁有該訂單。」
// ❌ 危險寫法
app.get('/api/orders/:id', async (req, res) => {
const order = await db.query(`SELECT * FROM orders WHERE id = ${req.params.id}`)
res.json(order) // 任何人只要改 ID 就能看
})
// ✅ 安全寫法
app.get('/api/orders/:id', async (req, res) => {
const order = await db.query(
'SELECT * FROM orders WHERE id = $1 AND user_id = $2',
[req.params.id, req.user.id] // 同時驗證使用者
)
if (!order) return res.status(404).json({ error: '找不到' })
res.json(order)
})
Vibe Prompt
「幫我寫一個 API 權限測試腳本:嘗試存取其他用戶的訂單、修改其他用戶的資料。」
關鍵要點
- ✅ IDOR (Insecure Direct Object Reference) = 能存取不該存取資源
- ✅ BOLA (Broken Object Level Authorization) = IDOR 在 API 中的術語
- ✅ 水平越權:存取同權限的其他用戶資料(如查看別人的訂單)
- ✅ 垂直越權:存取更高權限的功能(如一般用戶變管理員)
防禦策略
| 方案 | 強度 | 實作方式 |
|------|:----:|---------|
| UUID 取代連續 ID | 低 | /api/orders/uuid-v4 — 只能提高猜測難度 |
| 使用者在 Context 中 | 中 | 從 JWT/Session 取得使用者 ID,不從請求取 |
| 所有權檢查 | 高 | 每次查詢都確認 WHERE user_id = current_user |
| RBAC 權限驗證 | 高 | 每個端點都有權限檢查中介軟體 |
# ✅ 安全的做法:從 Token 取得 User ID,不信任用戶輸入
@app.get("/api/orders/{order_id}")
async def get_order(order_id: str, user: User = Depends(get_current_user)):
order = await db.fetch_one(
"SELECT * FROM orders WHERE id = $1 AND user_id = $2",
order_id, user.id
)
if not order:
raise HTTPException(404, "訂單不存在")
return order
常見錯誤
防禦檢查清單
- [ ] API 是否使用 UUID 而非連續數字 ID?
- [ ] 每個 API 端點是否都有使用者所有權檢查?
- [ ] 資料庫查詢是否包含
WHERE user_id = current_user? - [ ] 管理員 API 是否有角色權限檢查?
- [ ] 是否使用 RBAC 中介軟體保護敏感端點?
IDOR:最容易被忽略的授權漏洞
IDOR(Insecure Direct Object Reference)是指 API 直接使用了可預測的 ID(數字序號、UUID)來識別資源,但沒有檢查使用者是否有權限存取。
IDOR 的典型場景
GET /api/orders/1001 → Alice 的訂單
GET /api/orders/1002 → 改成 1002 就是 Bob 的訂單!
如果 API 沒有檢查「這個訂單屬於目前登入的使用者嗎?」
→ 這就是 IDOR 漏洞
測試 IDOR 的方法
| 測試方式 | 做法 |
|:--------|:----|
| 修改 ID 參數 | user_id=1001 → user_id=1002 |
| 修改 UUID | 嘗試已知的 UUID |
| 陣列注入 | {"ids":[1001,1002,1003]} |
| 批次 API | 批次端點是否也缺少權限檢查 |
下一章預告:Rate Limiting
IDOR 漏洞讓你可以存取別人的資料。下一章的 Rate Limiting 漏洞讓你可以無限次嘗試——暴力破解密碼、無限建立帳號。