全部產品
Search
文件中心

Edge Security Acceleration:API架構合規驗證

更新時間:Oct 29, 2025

上傳API的架構標準後,ESA將自動匹配符合該規範的已管理API,同時針對傳入的請求進行合規驗證並進行處理,保障業務API安全。

功能原理

當您的API已在ESA API管理中時,即可對已管理的API統一進行結構描述驗證。

  1. 使用者請求到達ESA節點後,會判斷請求調用的是否為已管理API:

    • 若不是,則在該階段允許存取,由其他功能設定進行處置;

    • 若是,則匹配對應API的架構規範。

  2. 根據架構規範判斷請求是否合規:

    • 若不合規,則根據配置的執行動作進行處置,並記錄不合規日誌。

    • 若合規,則允許存取。

配置結構描述驗證設定

在使用結構描述驗證功能之前,需要完成架構規範上傳,再開啟功能生效開關。

  1. 在ESA控制台,選擇網站管理,在網站列單擊目標網站。

  2. 在左側導覽列,選擇安全防護 > API安全

  3. API安全頁面,選擇結構描述驗證頁簽,單擊結構描述驗證設定image

  4. 在設定頁面,單擊上傳架構,上傳自訂的架構檔案。image

  5. ESA會根據架構檔案自動匹配對應的API,檢查後單擊確認image

  6. 架構上傳後,可以配置針對不合規請求執行的預設動作,建議配置觀察,並開啟狀態開關。image

  7. 返回結構描述驗證頁簽,即可展示結構描述驗證運行效果。image

分析不合規請求

配置完成結構描述驗證後,ESA將持續對API請求進行檢測。您可以在結構描述驗證頁簽單擊API列表功能表列的image篩選按鈕,選擇對應的架構篩選出需要分析的架構,即可為您展示相應的API,並在不合規請求列中展示近24小時的不合規請求數。image

不合規請求可能由幾個原因導致:

  • 用戶端行為問題:用戶端出現傳參格式錯誤(如需JSON卻傳表單資料)、必填參數缺失、類型不符(字串傳布爾值)等問題時,可能導致不合規請求數增加。出現此類問題時,需要檢查業務前端設計,增加錯誤偵測機制、提交提醒等。

  • 異常攻擊行為:當攻擊者進行注入攻擊、暴力破解等攻擊行為時,可能導致不合規請求數增加。出現此類問題時,您的業務系統可能正在遭受攻擊,建議您更改執行動作為攔截,並配置更嚴格WAF規則。

請求詳情分析

為了分析定位不合規請求原因,可通過事件分析安全分析功能中的採樣日誌查看詳情。

  1. 首先通過特徵篩選出不合規請求異常的API。image

  2. 根據配置的執行動作來選擇合適的日誌功能:

    • 執行動作為無:由於該類請求沒有觸發安全執行動作,因此更適合使用安全分析進行分析。

    • 執行動作為觀察/攔截:由於該類請求觸發了安全執行動作,採集範圍相對更集中,更適合使用事件分析

  3. 此處以事件分析為例,在左側導覽列選擇安全防護 > 事件分析

    若需要使用安全分析,則在左側導覽列選擇安全防護 > 安全分析
  4. 事件分析頁面下滑至採樣日誌地區,篩選命中API安全的日誌列,單擊列前的image展開按鈕查看詳情,根據請求詳情特徵進行分析判斷。同時您也可以結合即時日誌對訪問日誌進行更詳細的分析

更改執行動作

您可以為所有API統一配置預設的不合規請求執行動作,也可根據需求為特定API進行設定。

  • 修改全域預設執行動作:在結構描述驗證頁簽單擊預設執行動作欄的更改按鈕,選擇合適的動作即可:

    • 攔截:阻止不合規的請求,並記錄攔截日誌。

    • 觀察:允許存取不合規的請求,並記錄日誌。

    • :不進行任何操作。

    image

  • 配置特定API執行動作:在結構描述驗證頁簽的API列表單擊對於API列右側的更改執行動作,選擇合適的動作即可。

    • 預設:使用全域預設執行動作。

    • 攔截:阻止不合規的請求,並記錄攔截日誌。

    • 觀察:允許存取不合規的請求,並記錄日誌。

    • :不進行任何操作。

      image

分析無架構的API

當您成功上傳架構檔案後,符合架構的API將自動綁定對應的架構。您可以在結構描述驗證頁簽單擊無架構的API數量欄的篩選按鈕進行篩選查看無架構的API列表。image

針對無架構的API,ESA無法進行不合規請求統計,因此針對這類API對業務可能並不安全。無架構的API可能來自:

  • 架構中遺漏:在上傳的架構中遺漏了該類API。您可以核對列表中的API路徑、主機記錄、請求方案等資訊特徵,重新調整上傳架構檔案解決。

  • API不合規範:已發現的API不符合規範。在API開發過程中,出現不規範開發,需要重新對不合規API進行修改或重構,通常包含以下幾類:

    • 路徑不規範:API的路徑有誤,如正確的paths應為/users,錯誤時寫為/user

    • HTTP方法誤用:方法未遵循語義化原則,如用DELETE對應/users/delete/123的路徑,錯誤時寫為GET方法。

    • 狀態代碼濫用:API響應狀態代碼有誤,如所有響應需返回200 OK,錯誤時在Body中寫{ "responses": “500” }

    • 輸入輸出結構混亂:輸入輸出內容有誤,如輸入應包含email欄位,但錯寫至輸出中。

架構檔案說明

類型和大小

結構描述驗證檔案僅支援 .yml.yaml.json 格式,最大上傳大小為 58KB。如果上傳架構檔案過大,可以使用.json格式並且在本地進行壓縮。

架構內容

版本

ESA API安全結構描述驗證當前僅支援OAS v3.0.x版本。

欄位

必選欄位

  • openapi:API版本資訊,如3.0.0

  • info:架構檔案說明,如“version”:“1.0.0”

  • paths:至少包含一個API路徑,如/api

  • servers:Host資訊。支援以下子欄位:

    • url:僅支援絕對URL,如https://api.example.com

    • variablesESA不支援伺服器變數,解析時將忽略變數預留位置。

可選欄位

  • schema: 資料結構定義,支援以下類型:

    • int32

    • uint32

    • int64

    • uint64

    • float

    • double

    • boolean

    • email

  • reference:使用$ref指向預定義對象,不支援外部和相對參照。

  • requestbody:定義請求體,僅支援content-typeapplication/json 類型資料。

樣本

.json 格式檔案為例。
{
    "openapi": "3.0.0",
    "info": {
        "title": "example",
        "description": "example",
        "version": "1.0"
    },
    "servers": [
    {
      "url": "https://example1.aliyun.com",
      "description": "example1 url"
    },
    {
      "url": "https://example2.aliyun.com",
      "description": "example2 url"
    }
    ],
    "components": {
        "schemas": {
            "ParamsObject": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "value": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "value"
                ]
            }
        }
    },
    "paths": {
        "/example/{param1}": {
            "get": {
                "operationId": "getexampleById",
                "parameters": [
                    {
                        "name": "param1",
                        "in": "path",
                        "required": true,
                        "description": "id",
                        "schema": {
                            "type": "integer",
                            "format": "int32"
                        }
                    }
                ]
            }
        },
        "/api1": {
            "post": {
                "operationId": "post_api1",
                "summary": "post api1 request",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ParamsObject"
                            }
                        }
                    }
                }
            },
            "get" :{
                "operationId": "get_api1",
                "summary": "get api1 request",
                "parameters": [
                    {
                        "name": "id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "format": "int32"
                        }
                    },
                    {
                        "name": "name",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        }
    }
}