API 把資料、物件與業務動作直接暴露成可重複呼叫的介面。要有效檢測風險,團隊不能只掃一份 URL 清單,而要先知道有哪些版本與環境、誰能呼叫什麼、每個物件與欄位如何授權、一次請求會消耗多少資源,以及第三方回傳資料如何進入內部系統。這篇指南把 REST、GraphQL、OAuth 與 OWASP API Security Top 10 放進同一套可執行的掃描流程。

先講結論:API 弱點掃描是在驗證信任邊界,不是掃一份 URL
傳統頁面掃描常從 Link、Form 與 JavaScript 找到入口;API 則直接接收結構化資料、物件識別碼、Token、批次操作與狀態轉換。相同 Endpoint 對不同使用者、租戶、角色、Scope、HTTP Method 或物件狀態,可能產生完全不同的安全結果。只用一組帳號跑一次 Crawl,通常只能看到介面的一小部分。
有效的 API 弱點掃描要同時回答五個問題:資產是否完整、Request 是誰送的、他想對哪個物件做什麼、Server 是否只回傳與接受必要欄位,以及這個動作能否被大量或不按順序地濫用。任何一項缺少 Context,掃描器都可能把真正越權判成正常,也可能把預期的 403 或 Business Rule 誤判為弱點。
因此 API Security 是持續流程:以 Inventory 與 Contract 建立可測範圍,用多組最小權限測試身分重播 Request,對物件與欄位做差異驗證,再把結果回到程式碼、Policy、Gateway、監控與修復複驗。一次性工具報告只能提供訊號,不能代表 API 已安全。
- 先盤點 Host、Base Path、Version、Protocol、Environment、Owner 與資料敏感度
- 用至少兩個同權限主體、不同租戶與不同角色建立可比較的授權測試矩陣
- 以 OpenAPI/GraphQL Schema、Client Traffic、Gateway Log 與服務路由交叉補齊 Endpoint
- 把物件層、欄位層、功能層與業務流程授權分開驗證
- 所有測試都要有合法授權、速率與副作用控制,以及可重播的修復複驗證據
API 弱點掃描與網站頁面掃描有什麼不同?
網站頁面通常帶有可見導覽與 HTML 表單,API 的攻擊面卻可能只存在於 Mobile App、SPA、Partner Integration、Service-to-Service Traffic、Webhook、背景 Job 或已停止公開文件的舊版本。若掃描從首頁開始,沒有 Contract 或真實 Traffic,許多 Endpoint 根本不會被發現。
API Request 也更常帶有 Authorization Header、Tenant Header、JSON Body、GraphQL Operation、Idempotency Key、Signature、Nonce 或 Client Certificate。掃描器若不理解這些前置條件,只會收到 401、403 或格式錯誤;若為了提高覆蓋而使用過度權限 Token,又可能錯過一般使用者的授權差異。
| 面向 | 網站頁面掃描 | API 弱點掃描 | 缺少時的盲區 |
|---|---|---|---|
| 入口發現 | Link、Form、DOM、JavaScript | Contract、Schema、Traffic、Gateway、Client | 未被 UI 連結的 Endpoint |
| 狀態 | Cookie 與頁面流程 | Token、Scope、Tenant、物件與版本 | 跨角色、跨租戶與舊版 API |
| 資料格式 | HTML、Form、Query | JSON、GraphQL、Multipart、Binary、Event | 欄位與批次操作 |
| 核心風險 | 注入、瀏覽器與頁面設定 | 物件/欄位/功能授權與業務濫用 | BOLA、BOPLA、BFLA |
| 完成證據 | Response 與瀏覽器行為 | Response、狀態變更、後端資料與稽核事件 | Blind 或非同步結果 |
第一步不是送 Payload,而是建立 API Inventory
OWASP API9:2023 Improper Inventory Management 特別指出,舊版本、Beta Host、測試環境與文件落差會讓較弱的驗證、Rate Limit 或修補狀態繼續暴露。Inventory 不能只有一張 Endpoint 表;至少要記錄 Environment、Version、網路可達性、Owner、Consumer、認證方式、資料分類、部署版本與淘汰日期。
盤點來源要交叉比對。OpenAPI 文件可能比實際部署舊,Gateway 只看得到經過 Gateway 的流量,程式路由不一定包含 Serverless 或第三方 Webhook,DNS 與 Certificate Transparency 只顯示部分外部面。Contract、Gateway、Service Mesh、Source Route、Cloud Inventory、Mobile/Web Client 與外部 Attack Surface 的聯集,才接近真實範圍。
| 欄位 | 要回答的問題 | 證據來源 | 維護觸發點 |
|---|---|---|---|
| Host/Base Path/Version | 實際部署在哪裡? | DNS、Gateway、Route、Cloud Inventory | 部署、DNS、版本變更 |
| Environment/Exposure | Public、Partner 還是 Internal? | Firewall、Gateway、Service Mesh | 網路與存取政策變更 |
| Owner/Repository/Service | 誰能修、程式在哪裡? | CMDB、Catalog、Source Control | 團隊與服務移轉 |
| Auth/Consumer | 誰用何種憑證呼叫? | Contract、IdP、Client Registry | Client、Scope、驗證變更 |
| Data/Business Criticality | 處理什麼資料與動作? | Data Flow、Privacy Inventory、Threat Model | Schema 與業務流程變更 |
| Lifecycle | 何時推出、淘汰、最後掃描? | Release、Deprecation、Security Record | 每次 Release 與到期 |
掃描範圍與授權要怎麼定義?
API 測試可能建立帳號、下單、寄送 OTP、呼叫付費服務、上傳檔案、修改資料或觸發非同步 Job。開始前要用書面授權定義 Host、Environment、允許 Method、測試時間、來源 IP、Rate、測試帳號、資料處理、禁止動作、緊急聯絡人與停止條件。第三方 API、Cloud Metadata、Partner Environment 與 Production Data 不會因為從自己的 API 間接呼叫就自動進入授權範圍。
優先在與 Production 控制一致、資料隔離的環境做深度測試;若必須測 Production,使用專用 Tenant、可回收資料、低速率、可辨識 Header、成本上限與即時監控。任何可能造成大量通知、金融交易、庫存變動或不可逆資料刪除的操作,都要先建立替代驗證或明確人工 Gate。
OpenAPI、GraphQL Schema 與真實 Traffic 各自提供什麼?
Contract 能描述 Path、Method、Parameter、Request Body、Response Schema 與 Security Scheme,適合建立正向與負向測試;但它不一定包含未文件化路由、Feature Flag、舊版與真實使用順序。真實 Traffic 能補上 Client 實際 Header、Token、狀態與資料組合,卻可能缺少低頻管理功能,且必須去識別化與妥善保護秘密。
GraphQL Schema 能列出 Type、Field、Argument、Query 與 Mutation,但不直接說明每個 Resolver 的授權規則、資料成本或跨欄位關係。安全測試應把 Schema 當作攻擊面地圖,再用不同主體、物件與 Operation 驗證真正的 Resolver 行為。
| 來源 | 最適用途 | 主要盲點 | 安全處理 |
|---|---|---|---|
| OpenAPI/AsyncAPI | 結構化產生 Request 與 Contract Test | 文件漂移、Hidden Route | CI 比對部署與文件 |
| GraphQL Schema | Type、Field、Query、Mutation 盤點 | Resolver 授權與成本 | 限制 Schema 存取並做 Resolver 測試 |
| Client Traffic | 真實 Header、順序、資料組合 | 低頻功能與未被使用路由 | 移除 Token、PII、Secret |
| Gateway/Service Log | 實際 Host、Version、Consumer 與錯誤 | 繞過 Gateway 的路徑 | 最小化敏感內容與 Retention |
| Source Route | 未公開與條件式路由 | 部署差異、動態路由 | 對照 Release Artifact |
先建立身分、角色、租戶與物件的測試矩陣
API 授權弱點需要比較。至少建立兩個同角色使用者 A/B,若有 Multi-Tenant 再建立 Tenant A/B,並準備一般使用者、管理者、唯讀、停用、未驗證與過期 Token 等狀態。每個測試先取得合法 Baseline,再只改一個維度,例如 Object ID、Tenant Header、Field、Method 或 Scope,才能把差異歸因於授權。
不要用單一 Super Admin Token 代表所有覆蓋。它能發現輸入與設定問題,卻不能證明一般角色受到限制。也不要把 JWT Claim 當成授權真相;測試必須觀察 Resource Server 是否以可信 Server-Side Policy 驗證 Actor、Action、Resource、Tenant 與 Context。
| 維度 | 合法 Baseline | 負向變化 | 期待結果 |
|---|---|---|---|
| 同角色跨物件 | User A 讀取 A-100 | User A 讀取 B-200 | 404/403,無資料與副作用 |
| 跨租戶 | Tenant A Token+A Object | Tenant A Token+Tenant B Object | 拒絕且不洩漏存在性 |
| 跨角色功能 | Admin 執行停用 | 一般 User 執行相同 Method/Path | Server-Side 403 |
| 欄位 | 更新 displayName | 加入 role、ownerId、balance | 拒絕或忽略未授權欄位 |
| 狀態 | Active Order 取消 | Completed/Other User Order 取消 | 符合狀態機與物件授權 |
| Token | 正確 aud/scope/tenant | 錯誤 aud、缺 scope、已撤銷 | 401/403 且不可重播 |
OWASP API Security Top 10 2023 應該怎麼使用?
OWASP API Security Top 10 2023 是教育與風險認知文件,聚焦 API 特有或特別重要的風險。官方也說明,它不取代其他 Top 10,更不會替每個組織完成風險分析;Injection、弱元件等一般應用風險即使不在 API Top 10,仍然存在。
實務上應把十類風險映射到 Inventory、Threat Model、Secure Design、Code Review、Automated Test、Manual Test、Gateway Policy 與 Monitoring,而不是把『掃過 Top 10』當成單一 Checkbox。每一類都要定義適合自己的資產、證據、Owner 與修復 Gate。
| 類別 | 核心風險 | 主要測試軸 | 常見必要證據 |
|---|---|---|---|
| API1 BOLA | 物件層授權失效 | Actor × Object × Action | 跨主體重播的差異 |
| API2 Broken Authentication | 身分與憑證流程失效 | Token、登入、Recovery、MFA | 無效/過期/撤銷憑證結果 |
| API3 BOPLA | 欄位讀寫授權失效 | Read/Write Field | 過度回傳或未授權欄位變更 |
| API4 Resource Consumption | 資源與成本無限制 | Size、Count、Depth、Concurrency | 限制、429、Timeout 與成本指標 |
| API5 BFLA | 功能層授權失效 | Role × Method × Route | 低權限呼叫高權限功能 |
| API6 Sensitive Business Flows | 自動化濫用業務流程 | Sequence、Volume、Economic Rule | 業務影響與反濫用控制 |
| API7 SSRF | Server 代打非預期目的地 | URL、Redirect、DNS、Protocol | 實際 Egress 與 Destination |
| API8 Misconfiguration | API Stack 設定不安全 | TLS、CORS、Error、Method、Debug | 實際 Response 與部署設定 |
| API9 Inventory | 舊版與未知資產暴露 | Host、Version、Environment、Owner | 部署與 Catalog 差異 |
| API10 Unsafe Consumption | 過度信任第三方 API | Trust、Validation、Redirect、Limit | 第三方異常輸入的處理 |
API1 BOLA:為什麼換一個 Object ID 就可能越權?
Broken Object Level Authorization 發生在 Endpoint 接收訂單、檔案、帳戶、專案或其他物件識別碼後,沒有驗證目前 Actor 是否能對該物件執行該 Action。ID 是整數、UUID 或無法猜測的字串都不影響授權責任;不可猜測只降低發現機率,不能取代 Server-Side Check。
測試先由 User B 建立物件,再用 User A 的合法 Token 重播相同 Request,只替換 Path、Query、Header、Body 或 Nested Object 中的 ID。讀取、更新、刪除、分享、匯出、下載與子資源都要分開驗證;200 與資料外洩固然是證據,Blind Update、狀態改變或不同 Response Length 也可能證明越權。
| 識別碼位置 | 測試例 | 需要驗證 | 安全實作 |
|---|---|---|---|
| Path | /orders/A-100 → B-200 | 讀寫刪除是否跨 Owner | 以 Actor+Object Query 強制授權 |
| Query | ?account_id=... | Filter 是否越出租戶 | Server 綁定 Tenant 與 Owner |
| JSON Body | projectId/userId/fileId | Nested Object 是否授權 | 每個 Target Object 做 Policy Check |
| Header | X-Tenant-ID/X-Account | Client 是否能任意切 Tenant | 從可信身分 Context 取得 |
| GraphQL | node(id:)/Mutation Input | Node 與 Edge 是否都授權 | Resolver/Data Loader 層強制 |
API2 Broken Authentication:Token 驗證不是只看簽章
API 身分驗證涵蓋 Login、Token Issuance、Refresh、Revocation、Password Reset、MFA、API Key、Client Credential 與 Service Identity。JWT 驗證除了 Signature,還要固定 Algorithm、驗證 issuer、audience、expiration、not-before、必要 scope 與 token type;Opaque Token 則要確認狀態、Audience、撤銷與 Cache 行為。
掃描應測試缺少 Token、錯誤 Scheme、格式變異、過期/未生效/撤銷 Token、錯誤 Audience、錯誤 Issuer、Scope 缺少、不同 Client Token、Refresh Token 重播與同一憑證跨服務使用。登入與 Recovery 還要驗證 Rate Limit、帳號枚舉、MFA Bypass、一次性憑證與 Session 輪替。
API3 BOPLA:過度回傳與 Mass Assignment 是同一個欄位邊界問題
Broken Object Property Level Authorization 同時包含未授權讀取欄位與未授權修改欄位。API 可能把完整資料模型序列化後交給 Client 自行隱藏,造成 PII、內部狀態、成本、權限或審核欄位過度回傳;也可能直接把 JSON 綁定到 Domain Model,讓 Client 加入 role、ownerId、approved、creditLimit 等不應可寫的欄位。
測試要建立 Read Allowlist 與 Write Allowlist。比較不同角色 Response Schema,檢查 Nested Object、Error、Export、Search、GraphQL Fragment 與批次結果;在 Create/Update/Patch Request 加入敏感、唯讀、未知、Null 與 Nested Field,再從後續 Read、Audit Log 或資料庫狀態確認是否被接受。
| 方向 | 弱點訊號 | 測試方式 | 修復原則 |
|---|---|---|---|
| Read | 回傳內部或高權限欄位 | 跨角色比較 Schema 與 Value | 專用 Response DTO+欄位 Allowlist |
| Write | Client 可改唯讀/高權限欄位 | 加入額外、Nested 與 Null Field | 專用 Input DTO+Server 指定敏感欄位 |
| GraphQL | 低權限仍可選取敏感 Field | 不同角色 Query 相同 Field | Field/Resolver Authorization |
| Patch | 部分更新繞過驗證 | JSON Patch/Merge Patch 變體 | 逐 Path Allowlist 與 Domain Rule |
API4 Unrestricted Resource Consumption:Rate Limit 只是其中一層
API 會消耗 CPU、Memory、Bandwidth、Database Connection、Thread、File Descriptor、Storage,以及 Email、SMS、OCR、AI、Payment 或第三方查詢等按次計費資源。OWASP API4 強調的不只是 Request 速率,也包含單次 Payload Size、Array Length、Page Size、Upload、Batch、GraphQL Depth/Cost、Execution Timeout 與 Concurrent Job。
安全測試採漸進方式,先確認明確限制與 4xx/429,再在核准窗口小幅增加 Size、Count、Depth 或 Concurrency,觀察 Response Time、CPU、Memory、Queue、第三方費用與其他 Tenant 的服務品質。不能用未設上限的壓力測試在 Production『證明』DoS。
| 維度 | 測試參數 | 必要控制 | 觀測指標 |
|---|---|---|---|
| Request Rate | 每秒/分鐘/突發 | User、Client、IP、Tenant 與 Route Bucket | 429、Retry-After、拒絕率 |
| Payload | Body、String、Array、Upload | Parser 前 Size Limit 與 Schema Bound | Memory、413、處理時間 |
| Query | Page Size、Sort、Filter、Join | Maximum、Timeout、Query Cost | DB Time、Rows、504 |
| Batch/GraphQL | Operation Count、Depth、Alias、Complexity | Count/Depth/Cost Limit | Resolver Count、CPU |
| 外部成本 | SMS、Email、AI、Payment | Quota、Budget、Confirmation、Circuit Breaker | 費用、供應商 Rate、Queue |
API5 BFLA:能到達 Endpoint 不代表能執行該功能
Broken Function Level Authorization 發生在低權限主體能呼叫管理、審核、匯出、停用、退款或其他高權限功能。常見原因是只在 UI 隱藏按鈕、只以 URL Prefix 保護管理路由、Gateway 與 Service Policy 不一致,或同一路徑的 GET 有檢查但 POST/DELETE 沒有。
測試以 Route × Method × Role 建立矩陣。先由合法管理者取得 Request,再替換成一般使用者、唯讀、其他 Tenant、不同 OAuth Client 或缺少 Scope 的憑證;同時測試 Method Override、Alternate Content-Type、Legacy Version、Batch 與 GraphQL Mutation。
| 功能 | 合法主體 | 負向主體 | 完成證據 |
|---|---|---|---|
| 匯出全部客戶 | 具 Export Scope 的管理者 | 一般使用者/其他 Tenant Admin | 拒絕且無 Export Job/下載檔 |
| 退款/核准 | 指定審核角色 | 建立者/唯讀角色 | 狀態、Ledger 與 Audit 均不變 |
| 停用帳號 | User Admin | Self-Service User | 403 且 Target 仍 Active |
| 管理 Mutation | Admin Client | Public SPA Token | Resolver 不執行且無副作用 |
API6 Sensitive Business Flows:技術上合法的 Request 也能傷害業務
搶票、搶購、建立假帳號、刷 Coupon、囤庫存、批量查價、邀請獎勵、內容灌水與 OTP 發送,往往使用合法帳號、合法 Schema 與預期 Endpoint。問題不在單一 Request 是否通過驗證,而在流程是否能被自動化、平行化、重播或繞過順序,造成經濟、資源或公平性影響。
測試要先由產品與風險團隊標出敏感流程、可接受頻率、稀缺資源、前置條件與異常模式,再驗證 Rate、Quota、Device/Account Reputation、Step Binding、Idempotency、Reservation Expiry、Challenge 與人工審查。單純加 IP Rate Limit 容易被分散式來源、帳號農場或不同 Client 繞過。
| 流程 | 濫用方式 | 單純 Rate Limit 的不足 | 組合控制 |
|---|---|---|---|
| 購票/下單 | 自動化囤積與並行提交 | 分散帳號與 IP | Queue、Identity、Quota、Reservation、Bot Signal |
| 帳號建立 | 批量假帳號 | 低速長時間建立 | Device、Risk Score、Verification、Velocity |
| Coupon/Referral | 自我邀請與循環兌換 | 每 IP 限制無法識別關係 | Graph、Eligibility、One-Time Rule、Audit |
| OTP/通知 | 成本與騷擾 | 多帳號打同一目標 | Target+Actor+Device Limit、Budget、Cooldown |
API7 SSRF:Webhook、匯入 URL 與預覽服務都是高風險入口
當 API 接收 URL、Hostname、Webhook、Image Fetch、Document Import、Callback 或其他遠端資源位置,再由伺服器發出 Request,就形成 SSRF 攻擊面。攻擊者可能導向 Loopback、Private Network、Cloud Metadata、管理介面,或利用 Redirect、DNS Rebinding、IPv6 與不同表示法繞過字串檢查。
掃描要從輸入到實際 Egress 建立證據,不能只看 Response 是否帶回內容。使用核准的受控測試端點觀察 DNS 與 HTTP Call,測試 Redirect 每一跳、Resolved IP、Scheme、Port、Credential、Timeout、Response Size 與 Network Egress Policy;禁止在未授權情況探測真實內網與 Metadata。
API8 Security Misconfiguration:設定可能散落在整條 API Stack
API 設定問題不只在程式。TLS、Gateway、Load Balancer、WAF、CORS、Reverse Proxy、Container、Framework、Error Handler、Cloud Storage 與 Service Mesh 都可能形成暴露。常見訊號包含 Debug/Stack Trace、寬鬆 CORS、未限制 Method、預設帳密、目錄或管理端點、舊 TLS、缺少 Cache Control、過度詳細錯誤與不必要服務。
檢測要比較外部 Response 與實際部署設定,並涵蓋所有 Host、Version 與 Environment。只看 Current Production Gateway 可能漏掉可直接到達的 Origin、Beta Host 或未經同一 Policy 的 Legacy Route。
| 層次 | 檢測項目 | 常見失敗 | 證據 |
|---|---|---|---|
| Transport/Edge | TLS、HTTP Method、Request Size | 舊協定、未限制 Method | Handshake、405/413 與 Edge Config |
| Browser Boundary | CORS、Cache、Content-Type | Wildcard+Credential、敏感 Cache | Origin Matrix 與 Response Header |
| Framework | Debug、Error、Parser、Default Route | Stack Trace、Prototype/Parser 風險 | Malformed Request 與 Config |
| Cloud/Runtime | Storage、Metadata、Admin、Secret | Public Bucket、管理端點暴露 | Cloud Policy 與 External Reachability |
API9 Improper Inventory Management:舊版本常是安全控制的旁路
新版本補上 MFA、Rate Limit 或欄位授權,不代表 v1、Beta、Regional Host、Mobile Legacy 或 Partner Endpoint 也同步受保護。攻擊者只要找到仍可到達的舊介面,就可能繞過 Current Version 的防線。版本淘汰要包含流量觀察、Consumer Migration、明確 Sunset、Route Removal、DNS/Certificate 清理與持續外部驗證。
掃描排程要以 Inventory 為來源,每個可到達版本使用相同基準 Control Set。若舊版因相容性無法立即修補,需用 Gateway Policy、Network Restriction、短期監控與明確到期的風險例外,而不是從掃描範圍移除。
API10 Unsafe Consumption of APIs:第三方 Response 仍是不可信輸入
內部 API 從支付、物流、地址、身分、AI 或其他 SaaS 收到的資料,不能因供應商品牌或 TLS 就直接信任。第三方可能被入侵、回傳異常格式、惡意內容、巨大 Response、Redirect、延遲或重複事件;若資料再進入 SQL、Template、Command、File、Log 或下游 API,就可能形成二階注入與供應鏈式影響。
測試可用 Mock/Sandbox 模擬錯誤 Schema、額外欄位、惡意字串、超大 Body、慢速 Response、重複/亂序 Webhook、錯誤簽章與 Redirect。系統應驗證 TLS 與目的地、Schema、Signature、Timestamp/Replay、Size、Timeout、Redirect、Idempotency,並以 Circuit Breaker 與隔離 Queue 限制故障。
| 輸入事件 | 風險 | 必要驗證 | 失敗處理 |
|---|---|---|---|
| 同步 Response | Schema/內容/大小惡意 | Status、Content-Type、Schema、Size | 拒絕、降級、Circuit Breaker |
| Redirect | Credential/敏感 Body 外洩 | 每跳 Host、Scheme、IP、Policy | 預設不跟隨或重新授權 |
| Webhook | 偽造、重播、亂序 | Signature、Timestamp、Nonce、Event ID | 去重、隔離、可重試 |
| File/Media | Parser 與儲存風險 | Magic Byte、Size、Sandbox、Re-encode | 隔離、掃描、拒絕 |
REST API 要怎麼測 Method、狀態碼與 Idempotency?
REST 測試不能只跑文件中的 Happy Path。每個 Resource 要驗證允許的 Method、Content-Type、Accept、Unknown Field、Missing Field、Duplicate Key、Null、Boundary、Pagination、Filter、Sort 與 Conditional Request。未允許 Method 應一致拒絕,不能因 HEAD、OPTIONS、PATCH、Method Override 或不同 Content-Type 進入另一條較弱路徑。
Status Code 要與安全語意一致,但不能把 200/403/404 當作唯一判定。重點是資料與副作用:失敗 Request 是否仍建立 Job、扣款、寄信或更新部分欄位;重試是否因缺少 Idempotency 造成重複交易;Idempotency Key 是否綁定 Actor、Route 與 Request Fingerprint,避免跨使用者重播。
| 類型 | 變化 | 期待控制 | 副作用確認 |
|---|---|---|---|
| Method | GET/POST/PUT/PATCH/DELETE/Override | 明確 Allowlist 與 405 | 未執行替代 Handler |
| Content Negotiation | JSON/Form/XML/錯誤 MIME | 只接受核准 Parser | 無 Parser Smuggling |
| Idempotency | 重送、並發、跨 Actor Key | Actor+Operation 綁定與保存期限 | 只產生一次業務效果 |
| Pagination | 負值、極大值、Cursor 竄改 | Bound、簽章或 Server Cursor | 不越權、不耗盡資源 |
| Conditional | ETag/If-Match 缺失或舊值 | 避免 Lost Update | 衝突不覆寫新資料 |
GraphQL API 要測 Depth、Cost、Batching 與 Resolver 授權
GraphQL 只有一個 HTTP Endpoint,不代表攻擊面更小。攻擊面存在於 Query、Mutation、Subscription、Type、Field、Argument、Resolver、Interface、Union、Alias、Fragment、Batch 與 Data Loader。OWASP 建議驗證輸入、限制昂貴 Query、對資料與 Mutation 強制存取控制,並關閉不必要的 GraphiQL、過度 Error 與公開 Introspection。
資源測試要同時看 Depth、Breadth、Alias、Fragment Expansion、List Cardinality、Nested Pagination、Batch Operation 與實際 Resolver Cost。只限制 Depth 可能被同層大量 Alias 繞過;只做 Rate Limit 可能允許一個 Request 包含數百次昂貴 Resolver。授權則要在 Node 與 Edge、Query 與 Mutation、Parent 與 Child Field 都執行。
| 測試面 | 攻擊變化 | 安全控制 | 量測 |
|---|---|---|---|
| Depth | 深層循環關聯 | 最大 Depth+Cost | Resolver Count、DB Query |
| Breadth/Alias | 同層大量欄位與別名 | Field/Alias/Complexity Limit | CPU、Response Size |
| Batching | 一個 Request 多 Operation | Batch Count、Auth、Rate 分攤 | 每 Operation 結果與成本 |
| Field Authorization | 低權限選敏感 Field | Resolver/Policy 層檢查 | 不同角色 Schema/Value 差異 |
| Introspection/Errors | Schema 探索與欄位猜測 | 依需求限制、Production Error 最小化 | 未洩漏 Internal Type/Stack |
OAuth 與 Bearer Token 應該怎麼檢測?
OAuth 把 Authorization Server、Client 與 Resource Server 分開。Resource Server 必須驗證 Token 是由可信 Issuer 發出、Audience 指向自己、Scope 足以執行當下 Action,並區分 Access Token、ID Token 與其他 Token Type。不能只因 JWT 簽章有效就接受,也不能讓同一 Token 在所有 API 通用。
RFC 9700 整理 OAuth 2.0 現行安全最佳實務,包括避免不安全流程、嚴格 Redirect URI、PKCE、最小權限 Token,以及對 Public Client 的 Refresh Token 使用 Sender-Constrained 或 Rotation 來偵測重播。測試要驗證 Authorization Code 綁定 Client/Redirect/PKCE,Access Token 的 iss/aud/scope/exp,以及 Refresh Token Rotation、Family Revocation 與 Concurrent Refresh。
| 元件 | 負向測試 | 期待結果 | 高風險失敗 |
|---|---|---|---|
| Authorization Request | Redirect 變體、缺 PKCE、State 混淆 | 精確比對與流程拒絕 | Code/Token 被導向攻擊者 |
| Access Token | 錯 iss/aud/scope/type/exp | Resource Server 拒絕 | 跨 API 或過期 Token 可用 |
| Refresh Token | 舊 Token 重播、並行 Rotation | 偵測重播並撤銷 Family | 長期 Session 被接管 |
| Client | Public Client Secret、錯 Client Binding | 依 Client Type 使用正確控制 | Secret 被反編譯或 Token 混用 |
Rate Limit 要綁誰、限制什麼,才不會一繞就過?
單一 IP Limit 無法涵蓋 NAT、Proxy、IPv6、Botnet 與已登入帳號;單一 User Limit 也可能讓攻擊者用帳號農場濫用。應依風險組合 Actor、Client、Tenant、Target、Device、IP、Route、Operation 與成本單位,並區分平常速率、短期 Burst、Concurrent Request、每日 Quota 與昂貴操作 Budget。
429 與 Retry-After 要一致,Gateway 與 Service 不能各自使用互相矛盾的 Key。安全測試要確認 Header/Forwarded IP 不能由外部偽造繞過、分散節點共享狀態、不同 API Version 套用相同策略,以及拒絕後沒有先執行昂貴工作。
| Key | 適合限制 | 單獨使用的弱點 | 應搭配 |
|---|---|---|---|
| IP/Network | 匿名掃描與粗粒度 Burst | NAT 誤傷、Botnet 繞過 | Device、Route、Challenge |
| User/Account | 登入後操作與 Recovery | 帳號農場、帳號被害 | Target、Device、Risk |
| Client/API Key | Partner 與應用配額 | Key 外洩或共享 | User、Scope、Quota、Revocation |
| Tenant | 避免單一租戶耗盡共享資源 | Tenant 內惡意使用者 | User、Route、Cost |
| Target/Business Object | OTP、Invite、Coupon、受害目標 | 分散 Actor 攻擊同目標 | Actor、Time Window、Fraud Signal |
錯誤訊息、Response 與 Log 不能洩漏什麼?
API Error 應提供 Client 可處理的穩定 Code 與 Correlation ID,但不應回傳 Stack Trace、SQL、Internal Host、File Path、Secret、Token、完整物件、存在性差異或未授權欄位。Authentication 與 Authorization 的錯誤差異要兼顧可觀測性與資訊洩漏,詳細原因留在受保護的 Server Log。
Log 也不能直接記錄 Authorization Header、Session ID、API Key、Password、OTP、Private Key、完整 Cookie 或敏感 Payload。可用 HMAC/不可逆 Fingerprint 關聯 Token 生命週期,記錄 Actor、Tenant、Route、Decision、Reason、Object 類型、風險訊號與 Trace ID,並限制存取與保存期限。
API 業務邏輯與狀態機要怎麼測?
許多高衝擊問題不屬於單一 Payload,而是順序錯誤:未付款先出貨、已退款再次退款、取消後仍下載、未完成驗證就升級、同一邀請重複領取、並發 Request 造成重複扣款。掃描要把每個流程建成 State Machine,列出允許的 Transition、Actor、前置條件、次數、金額與不可變條件。
對每條合法 Transition 建立 Baseline,再測試跳步、倒序、重播、平行、過期、跨 Actor、跨 Tenant、負數/邊界值與 Client-Supplied State。完成證據來自最終狀態、Ledger、Inventory、Message、Audit Event 與對外副作用,不是單看某一次 Response。
| 測試 | 例子 | 必要控制 | 證據 |
|---|---|---|---|
| 跳步 | 未驗證直接完成敏感操作 | Server 驗證前置狀態 | 狀態未改變 |
| 重播 | 同 Payment/Coupon 重送 | Idempotency+唯一業務約束 | 只產生一次效果 |
| 並發 | 兩次同時扣庫存/退款 | Atomic/Lock/Version Check | Invariant 保持 |
| 跨 Actor | A 完成 B 的流程 | Transition 層物件授權 | Owner 與 Audit 正確 |
| Client State | 自行提交 approved/price | Server 計算與可信資料來源 | 敏感值不可由 Client 覆寫 |
自動化 DAST 能覆蓋哪些 API 問題?
有 Contract、可用憑證與安全測試資料時,自動化工具很適合做 Endpoint 發現、Schema 邊界、Injection Payload、Header/CORS/TLS 設定、已知 Pattern、Method、Content-Type、部分 BOLA 差異、Rate Limit 訊號與修復回歸。它能以固定頻率對相同資產產生一致證據。
但工具通常不知道『A 是否應看 B 的訂單』、『一張票最多能買幾張』、『這次退款是否符合業務條件』,也無法獨立確認所有 GraphQL Resolver、非同步副作用、第三方成本與組織允許的風險。這些需要 Threat Model、Contract Test、程式碼審查、人工測試與業務 Owner 判斷。
| 問題 | 自動化適合度 | 必要輸入 | 需要補強 |
|---|---|---|---|
| Schema/Injection/Misconfiguration | 高 | Contract、Traffic、Auth | 程式碼與部署設定 |
| BOLA/BFLA/BOPLA | 中 | 多主體、多物件、期待 Policy | 人工授權矩陣與資料驗證 |
| GraphQL Cost/Resource | 中 | Schema、Cost Model、監控 | 受控壓力與後端指標 |
| Sensitive Business Flow | 低至中 | 流程、規則、經濟限制 | 產品/風險專家與濫用測試 |
| 第三方 API 與非同步事件 | 中 | Mock、Webhook、Queue Evidence | 整合測試與供應商治理 |
Authenticated API Scan 怎麼避免只拿到一堆 401?
掃描器需要可自動更新的測試憑證與明確最小權限。短效 Access Token 可透過受控 Test Client 或預掃描 Login Flow 取得;Service API 可使用專用 Client Credential;需要 MFA 的流程則以測試 IdP、受控 Automation 或人工 Gate 處理,不能把長效 Production Token 硬編碼在設定檔。
同一 Scan Job 依角色與 Tenant 分開執行,並使用獨立資料 Seed。Token 過期時應安全刷新,不把 Refresh Token 寫進 Report 或 Log;掃描結束後撤銷 Credential。Coverage 不是看到 2xx 的比例,而是每個 Endpoint/Method/Role/Object 狀態都有可重播 Baseline 與負向測試。
| 項目 | 安全做法 | 禁止做法 | 驗證 |
|---|---|---|---|
| 取得 | Test IdP/短效 Client/受控 Login | 人工複製長效 Token | Issuer、aud、scope、ttl |
| 儲存 | Secret Manager、執行期注入 | Repo、Report、CLI History | 掃描 Secret Detection |
| 權限 | 每角色最小 Scope 與 Tenant | 共用 Super Admin | Role/Scope Coverage |
| 生命週期 | 自動更新、結束即撤銷 | 永久 Key | Revocation Replay 失敗 |
| 資料 | 專用 Tenant、可回收 Seed | 真實客戶資料 | Cleanup 與 Audit |
一套可稽核的 API 弱點掃描流程
流程從 Inventory 與合法授權開始,將 Contract、Schema、Client Traffic、Gateway 與 Source Route 合併成 Endpoint Catalog;接著建立身份與資料 Seed,取得每個 Role 的合法 Baseline,再逐一變更 Object、Field、Function、Token、State 與 Resource Dimension。每次測試都保留 Sanitized Request、Response、Actor、Target、Time 與後端副作用證據。
結果進入技術驗證時,要重播最小 Case、排除 Cache/Race/測試資料污染,映射 OWASP API Category、CWE、Asset Criticality 與 Business Impact。修復後以原 Request 複驗,並跑正常 Client Contract/Regression Test,確認不是把 200 一律改成 403 或破壞既有整合。
| 階段 | 主要活動 | 交付物 | 完成條件 |
|---|---|---|---|
| 1. Inventory | 合併 Host、Version、Contract、Traffic | 可追溯 Asset Catalog | Owner 與 Exposure 完整 |
| 2. Scope | 授權、Rate、副作用與停止條件 | 測試計畫 | 所有利害關係人核准 |
| 3. Identity/Data | 建立角色、租戶、物件與狀態 | Test Matrix/Seed | 合法 Baseline 可重播 |
| 4. Discovery | Contract、Schema、Crawl、Traffic | Endpoint/Operation Catalog | 文件與部署差異已標記 |
| 5. Negative Test | Object、Field、Function、Flow、Resource | Request/Response/Effect Evidence | 每個 Risk Axis 有覆蓋 |
| 6. Validation | 最小重播、人工與後端確認 | Confirmed Finding | 誤報與限制清楚 |
| 7. Remediation | Policy、Code、Gateway、Monitoring | Fix+Regression | 根因而非單一 URL 修復 |
| 8. Retest | 原 Case+同類回歸+正常流程 | Closure Evidence | 攻擊失敗、合法 Client 正常 |

Production API 掃描如何控制風險?
Production 測試不應直接複製 Staging 的強度。使用明確識別的 Source、Header、User Agent、Test Tenant 與 Test Data,限制 Request Rate、Concurrency、Payload、Upload、Batch、GraphQL Cost 與外部費用。建立 Dashboard 觀察 Error Rate、Latency、CPU、DB、Queue、Third-Party Call 與告警,達到門檻立即停止。
對 Delete、Payment、Refund、Notification、Account Lock、Export、Webhook 與付費 API 使用 Dry Run、Sandbox、Mock、Feature Flag 或人工核准。掃描窗口結束要清理資料、撤銷 Token、確認 Queue 與 Job 沒有殘留,並保存 Scan ID 與 Change/Incident 關聯。
API Security 要怎麼進 CI/CD,而不是只在上線後掃?
在 Pull Request 階段檢查 Contract Diff、Security Scheme、敏感欄位、無上限 Array/Page Size、未授權 Route 與 Schema Breaking Change;在 Integration Environment 用多角色 Contract Test 驗證 401/403、BOLA、BOPLA、BFLA、Idempotency 與 GraphQL Cost;部署後再由外部 DAST 驗證真實 Gateway、DNS、TLS、CORS 與可到達版本。
Gate 必須以可行動的風險條件決定,而非任何 Scanner Finding 都阻擋。Confirmed Critical/High、核心授權回歸、敏感資料暴露與未核准 Public API 可直接停止;其餘依 SLA、Owner、資產與證據管理。Contract、Test、Inventory、Finding 與 Release 應共享 Service/Version Identifier。
| 階段 | 自動化檢查 | 阻擋條件 | 保留證據 |
|---|---|---|---|
| Design/Contract | Schema Lint、Threat Model、Auth Annotation | 敏感 Route 無 Security/Owner | Contract Diff、Decision |
| Unit/Component | Policy、Validator、Serializer、Cost Test | 授權/欄位/Bound Test 失敗 | Test Result、Coverage |
| Integration | 多角色、多租戶、狀態機、OAuth | Confirmed Authorization Regression | Request/Response/State |
| Deploy | Inventory Diff、External DAST、Config | 未知 Public API、Critical Finding | Asset/Release/Scan ID |
| Runtime | Abuse、Rate、Auth、Egress、Drift | 異常超過門檻 | Metric、Trace、Incident |
API 弱點報告要包含哪些證據才可修?
報告應讓 Owner 在不接觸真實客戶秘密的前提下重現問題。最小欄位包含 Asset/Version、Endpoint/Operation、Actor/Role/Tenant、前置資料、Sanitized Request、Baseline 與 Negative Response、實際資料或狀態差異、OWASP API Category、CWE、Business Impact、修復方向與 Retest Condition。
BOLA 不能只寫『更換 ID 可存取』,要說明 A/B 身分、物件 Ownership、被讀或被改的欄位與後續狀態;Resource Consumption 不能只貼 Timeout,要提供合法限制、測試增量、Server Metric 與停止點;Business Flow Abuse 則要由產品 Owner 確認經濟與流程影響。
修復 API 弱點時,為什麼不能只封鎖一個 Payload?
封鎖某個 ID、字串、User Agent 或單一路徑,只會修掉掃描樣本。BOLA 的根因通常是 Domain Query 或 Policy 沒有綁 Actor;BOPLA 是 Serializer/Binder 沒有欄位 Allowlist;BFLA 是功能 Policy 漏套 Method;Resource Risk 是 Cost Model 與 Bound 缺失;Business Abuse 則需要流程與經濟控制。修復應放在可被所有版本與入口一致重用的 Enforcement Point。
複驗先重播原 Case,再擴展到同 Controller、同 Object Type、同 Resolver、其他 Method、Batch、Legacy Version 與不同角色,確認不是局部 Patch。最後跑合法 Client、Partner Contract、Mobile Legacy、Performance 與 Error Handling Regression,避免安全修復造成無聲整合故障。
| Finding | 脆弱的局部修補 | 根因修復 | 回歸範圍 |
|---|---|---|---|
| BOLA | 封鎖特定 ID | 每次資料存取強制 Actor+Object Policy | 所有 CRUD、子資源、Batch |
| BOPLA | 移除一個欄位 | Read/Write DTO Allowlist+Policy | 所有角色、Export、GraphQL |
| BFLA | 封鎖一條 URL | Route/Action Policy Default Deny | Method、Version、Admin/Partner |
| Resource | 封鎖單一 Payload | Parser Bound+Cost+Quota+Timeout | Size、Depth、Count、Concurrency |
| Business Abuse | 加 IP Limit | 流程、身份、Target、Velocity 與風險控制 | 分散 Actor、重播、並發 |
修復後複驗要證明哪些事?
第一,原攻擊 Request 在相同 Actor、Object、Token 與狀態下必須失敗;第二,失敗不能留下資料、Job、Message、費用或部分更新;第三,同類入口與版本也受到相同控制;第四,合法 Owner、Admin、Partner 與 Mobile Client 仍能依 Contract 正常運作;第五,Log 與 Alert 能記錄被拒絕事件而不洩漏秘密。
對 Race、Idempotency、Refresh Rotation 與非同步流程,單次重播不足以結案,需重現並發與時間條件。對 Rate/Cost 類問題,要用核准增量測試證明 Limit 在昂貴工作前生效,且不會讓一個 Tenant 影響其他租戶。Closure Evidence 應綁定修復 Version 與部署 Artifact。
API Security 的最小可行導入路線圖
先不要從購買最多工具開始。第一階段建立所有 Public/Partner API 的 Inventory、Owner、Contract、資料分類與認證方式,先關閉未知 Host 與舊版本;第二階段為高價值 API 建立多角色授權矩陣、資源限制與業務流程 Threat Model;第三階段把 Contract、Policy Test、Authenticated DAST、Runtime Detection 與修復複驗接進 Release。
成熟後擴展到 Internal/Service API、GraphQL、Webhook、第三方 Consumption 與跨服務 Identity,建立統一的 Policy Library、Token Profile、Rate/Cost Model、Secure Logging 與 Exception Workflow。衡量 Coverage 時,使用 Asset、Operation、Role、Risk Axis、Verified Finding、Remediation Time 與 Retest Closure,不用單一『掃描完成率』。
| 期間 | 主要目標 | 優先交付物 | 成功指標 |
|---|---|---|---|
| 0–30 天 | 看見攻擊面 | Public/Partner Inventory、Owner、Contract、Exposure | 未知與無 Owner API 下降 |
| 31–60 天 | 建立可測信任邊界 | 角色/租戶/物件矩陣、Test Data、Top Risk Baseline | 高價值 Operation 有負向測試 |
| 61–90 天 | 形成持續閉環 | CI Gate、Authenticated DAST、Runtime Signal、Retest | Confirmed Risk 有 Owner、SLA 與 Closure |
| 持續 | 涵蓋變更與新架構 | GraphQL、Webhook、Service Identity、Third Party | Release 與 Inventory/Test 同步 |
API 弱點掃描最終檢查清單
掃描前,確認所有 Host、Version、Environment、Owner、Contract、資料分類、第三方依賴與合法授權;確認每個角色、Tenant、Object 與狀態都有專用測試資料與最小權限憑證。掃描中,除了 Injection 與設定,也要覆蓋 Object、Field、Function、Business Flow、Resource、Token、GraphQL 與第三方 Trust Boundary。
掃描後,所有 Finding 都有 Sanitized Evidence、Business Context、根因 Owner、SLA 與 Retest Condition;所有 Token 與測試資料已撤銷或清理;修復複驗同時證明攻擊失敗與合法 Client 正常。若這些條件沒有完成,就只能說某個工具執行過,不能說 API Security 已被驗證。
- Inventory 與實際部署、Gateway、Client Traffic、Contract 相符,舊版與 Beta 也在範圍內
- 至少有同角色雙主體、跨租戶、跨角色、過期/撤銷 Token 與關鍵狀態資料
- BOLA、BOPLA、BFLA、Business Flow、Resource、SSRF、Misconfiguration 與 Third-Party Trust 均有證據
- REST Method/Idempotency 與 GraphQL Depth/Cost/Batch/Resolver Authorization 已驗證
- Production 測試有速率、副作用、成本、監控、停止與清理控制
- 修復以根因與共用 Enforcement Point 完成,原 Case、同類入口與合法 Client 均通過複驗
資料來源
- OWASP API Security Top 10 2023 — API Security Risks↗
- OWASP API Security Top 10 2023 — Release Notes↗
- OWASP REST Security Cheat Sheet↗
- OWASP GraphQL Cheat Sheet↗
- OWASP API9:2023 Improper Inventory Management↗
- OWASP API10:2023 Unsafe Consumption of APIs↗
- RFC 9700 — Best Current Practice for OAuth 2.0 Security↗


