網站應用安全

權限控制與 IDOR:網址換一個編號,不該看到別人的資料

每個請求都必須在伺服器端驗證主體、動作與資源關係;不可只依賴隱藏按鈕、不可猜 ID 或前端角色。

權限控制與 IDOR:網址換一個編號,不該看到別人的資料

每個請求都必須在伺服器端驗證主體、動作與資源關係;不可只依賴隱藏按鈕、不可猜 ID 或前端角色。

01

身分驗證不等於有權限

登入只能證明目前是某個帳號,授權則決定這個帳號能對哪個資源做什麼。IDOR(不安全的直接物件參照)常發生在網址或 API 帶有訂單、檔案、使用者編號,而伺服器只確認「已登入」,沒有確認資源是否屬於該使用者或租戶。

隱藏按鈕、把 ID 換成 UUID、或在前端寫角色判斷都不能取代伺服器授權。攻擊者可以直接修改請求。

02

每個入口都做同一套判斷

授權邏輯應集中且預設拒絕:先確認主體、目標資源、動作、租戶與必要條件,再執行讀取或修改。列表、單筆、匯出、下載、批次、搜尋與舊版 API 都要使用相同規則。

資料庫查詢最好直接帶入擁有者或租戶條件,例如同時以資源 ID 與 tenant ID 查找,而不是先查出資源再靠前端決定是否顯示。

03

角色只是起點

角色型控制適合定義一般能力,例如客服可讀工單、財務可看付款;但還要加入資源關係與狀態,例如客服只能處理所屬組織的工單,已結案紀錄不可任意修改。高權限操作應要求更強驗證與完整稽核。

不要使用可由客戶端修改的角色 Cookie 或表單欄位作為信任來源。權限狀態應由伺服器端資料或經驗證的安全宣告取得。

04

避免過度暴露

API 回應只傳送目前畫面真正需要的欄位,避免先回傳完整資料再由前端隱藏。錯誤訊息不應讓未授權者分辨「資源存在但你不能看」與「不存在」,除非業務明確需要。

下載網址若為公開分享,使用高熵、可到期、可撤銷的 Token;若內容敏感,仍需登入與伺服器授權,不把長期可用的物件儲存網址直接交給任何人。

05

管理後台與服務帳號

管理功能使用獨立權限與最小範圍,不讓一般帳號只靠修改路徑進入。服務帳號與 API 金鑰也要限制可用動作、來源與有效期,不能共享一把全能金鑰。

權限變更、批次匯出、刪除、角色指派與跨租戶存取都應留下不可由一般使用者修改的稽核事件,並對異常量與失敗嘗試告警。

06

用權限矩陣測試

列出角色 × 動作 × 資源關係的矩陣,為允許與拒絕情境都建立自動測試。至少使用兩個不同帳號與兩個租戶,交換資源 ID、檔案 ID、父層 ID 與批次參數。

修補後不要只測原始網址;檢查同一資源的 API、行動版、匯出與歷史版本。授權漏洞往往是某個較少使用的入口漏掉共用檢查。