全部產品
Search
文件中心

Web Application Firewall:擴充外掛程式

更新時間:Jun 23, 2026

擴充外掛程式功能支援使用者編寫自訂 Lua 指令碼,深度介入 Web 應用程式的請求處理流程,從而實現 WAF 原生規則之外的個人化安全邏輯。通過靈活配置指令碼與參數,可以輕鬆滿足複雜的業務定製需求,極大提升安全防護的適配性與自由度。

開通擴充外掛程式功能

如需使用擴充外掛程式功能,需按以下步驟完成開通:

說明

適用版本:僅訂用帳戶WAF企業版、旗艦版與隨用隨付版支援開通此功能。

計費說明:該功能為收費服務,具體計費方式如下:

  • 隨用隨付版:無需預先購買即可直接使用,系統將根據實際使用方式產生額外費用。

  • 訂用帳戶版:需先完成購買方可使用。

  1. 登入Web Application Firewall3.0控制台。在頂部功能表列,選擇WAF執行個體的資源群組和地區(中國內地非中國內地

  2. 在左側導覽列,選擇防護配置 > 全局配置 > 扩展插件

  3. 單擊“立即購買”並根據頁面指引完成開通。

建立擴充外掛程式

扩展插件頁面,單擊新建扩展插件,然後完成以下參數配置。

  • 基礎資訊:填寫便於識別的插件名称插件描述

  • 插件代码:在此處編寫 Lua 指令碼以實現自訂防護邏輯,樣本如下。更多API說明,請參見附錄:自訂Lua指令碼API參考

    -- 自訂 Lua 指令碼樣本:提取 query 參數與自訂參數比較,不匹配則處置
    
    -- 第一步:提取請求參數
    local token = aliwaf.req.get_arg('token')
    
    -- 第二步:與自訂參數比較
    if token ~= params.token then
        aliwaf.func.punish()
    end 
    重要
    • 為保障WAF系統的穩定性,單條流量Lua指令碼的執行時間長度上限為2毫秒。在调试测试階段,若執行時間長度超過該限制,指令碼將無法通過測試並導致建立失敗;在實際運行階段,若某條流量的指令碼執行時間長度超過2毫秒,系統將強制跳過本次執行。

    • 請勿在代碼中寫入程式碼敏感資訊(如密鑰),建議使用下方的参数定义功能。

  • 参数定义:將指令碼中的“寫入程式碼”值提取為可配置參數,實現邏輯與資料解耦。這有助於在不修改代碼的情況下動態調整策略,或安全地管理密鑰。單擊添加参数。完成以下配置:

    • 參數名稱:對應指令碼中引用的變數名(如 secret_key)。

    • 参数类型:支援 字串、數字、布爾值、JSON Object 與 JSON Array。請確保類型與指令碼中的處理邏輯一致。

    • 参数描述:說明該參數的用途。

    • 参数值:支援以下兩種模式。

      • 手动输入:直接填寫具體的值。

      • 使用KMS凭证:引用Key Management Service中已建立的憑據,以安全儲存敏感性資料。若要使該憑據能被WAF成功引用,必須為其綁定以下標籤:

        • 標籤鍵waf:access:enable

        • 標籤值true

  • 调试测试

    • 插件处置参数:當前僅支援攔截模式,表示阻止請求。

    • 流量参数:類比真實的 HTTP 要求流量。單擊添加参数,輸入參數名(如 methoduriargs 等)及其對應的参数值

      樣本:設定 method 為 POSTuri 為 /login,以測試登入介面的防護邏輯。

  • 执行结果:單擊运行调试,系統將根據類比流量執行指令碼,然後查看右側的执行结果面板。若結果為失敗,請根據具體的錯誤資訊提示修正代碼。

後續步驟

擴充外掛程式建立完成後,需要在自訂規則防護模板中進行引用,具體資訊,請參見自訂規則

日常營運

扩展插件頁面,支援進行以下操作:

  • 查看外掛程式列表:頁面展示所有擴充外掛程式。可在列表上方的搜尋方塊中輸入外掛程式名稱,快速檢索目標外掛程式。

  • 查看關聯防護規則:定位至目標外掛程式,點擊关联规则列的image表徵圖,即可展示其關聯的防護規則ID。可複製該ID,在Web 核心防護安全報表頁面進行精準搜尋。

  • 編輯擴充外掛程式:定位至目標外掛程式,點擊操作列的編輯,即可對其配置資訊進行修改。

  • 刪除擴充外掛程式:定位至目標外掛程式,點擊操作列的刪除,即可移除該擴充外掛程式。

附錄:自訂Lua指令碼API參考

本附錄介紹編寫自訂 Lua 指令碼時可用的核心介面,包括請求資料讀取、加解密運算與請求流程式控制制。

HTTP請求樣本

POST /api/v1/orders?source=web&campaign=spring2024 HTTP/1.1
Host: shop.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
Cookie: session_id=abc123xyz; user_prefs=lang%3Den%26theme%3Ddark
Content-Type: application/json
Content-Length: 68
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
Accept: application/json

eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0=

讀取請求資料

所有介面傳回值為字串類型,欄位不存在時返回Null 字元串。

讀取method

專案

類型

說明

參數

-

-

傳回值

string

HTTP 要求方法,如 "GET"、"POST" 等。

-- POST --
local method = aliwaf.req.get_method()

讀取uri

專案

類型

說明

參數

-

-

傳回值

string

請求的 URI 路徑。

-- /api/v1/orders --
local uri = aliwaf.req.get_uri()

讀取網域名稱

專案

類型

說明

參數

-

-

傳回值

string

請求的 Host 網域名稱。

-- shop.example.com --
local domain = aliwaf.req.get_domain()

讀取query

專案

類型

說明

參數

-

-

傳回值

string

請求的完整 query 字串。

-- source=web&campaign=spring2024 --
local query = aliwaf.req.get_query()

讀取query parameter

專案

類型

說明

參數

string

query 參數名。

傳回值

string

對應參數值;參數不存在時返回Null 字元串 ""。

-- web --
local source = aliwaf.req.get_arg('source')

讀取cookie

專案

類型

說明

參數

string

cookie 名稱。

傳回值

string

對應 cookie 值;cookie 不存在時返回Null 字元串 ""。

-- abc123xyz --
local session_id = aliwaf.req.get_cookie('session_id')

讀取header

專案

類型

說明

參數

string

HTTP 要求頭名稱。

傳回值

string

對應 header 值;header 不存在時返回Null 字元串 ""。

-- Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx --
local auth = aliwaf.req.get_header('Authorization')

讀取body

判斷請求body狀態

  • body是否已經收完

    專案

    類型

    說明

    參數

    -

    -

    傳回值

    boolean

    true 表示請求 body 已全部收完;false 表示仍有資料未到達。

    local last = aliwaf.func.is_last_fragment_arrived()
  • body是否被截斷

    專案

    類型

    說明

    參數

    -

    -

    傳回值

    boolean

    true 表示請求體超出限制被截斷;false 表示請求體完整保留。

    WAF預設最多儲存128K的請求體,超過了會被截斷(超過部分丟棄不儲存)。

    local discard = aliwaf.func.is_request_body_discarded()

等待body

請求體以流式方式到達 WAF,指令碼執行時 body 可能尚未接收完成。如需處理完整 body,需顯式通知架構等待 body 接收完畢後再次執行指令碼。

專案

類型

說明

參數

-

-

傳回值

-

-

aliwaf.func.wait_request_body()

讀取請求body案例

-- body未收完, 等待body --
if not aliwaf.func.is_last_fragment_arrived() then
  aliwaf.func.wait_request_body()
  return
end

-- body已經收完, 判斷是否被截斷 --
if aliwaf.func.is_request_body_discarded() then
  return
end

-- eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0= --
local body = aliwaf.req.get_body()

-- TODO:對完整body做商務邏輯 --

通用工具函數

基礎編解碼

url、hex、base64三類編解碼介面接收字串參數並返回處理後的字串,操作失敗時返回Null 字元串。

url編解碼

  • escape_uri

    專案

    類型

    說明

    參數

    string

    待編碼的原始字串。

    傳回值

    string

    編碼後的字串。

  • unescape_uri

    專案

    類型

    說明

    參數

    string

    待解碼的 URL 編碼字串。

    傳回值

    string

    解碼後的原始字串。

-- a%20b --
local data1 = aliwaf.util.escape_uri('a b')

-- a b --
local data2 = aliwaf.util.unescape_uri('a%20b')

hex編解碼

  • hex_encode

    專案

    類型

    說明

    參數

    string

    待編碼的二進位字串。

    傳回值

    string

    大寫十六進位編碼字串。

  • hex_decode

    專案

    類型

    說明

    參數

    string

    待解碼的十六進位字串。

    傳回值

    string

    解碼後的原始字串;輸入非法時返回Null 字元串 ""。

-- DEADBEEF --
local data1 = aliwaf.util.hex_encode(string.char(0xDE, 0xAD, 0xBE, 0xEF))

-- \xDE\xAD\xBE\xEF --
local data2 = aliwaf.util.hex_decode('DEADBEEF')

base64編解碼

  • base64_encode

    專案

    類型

    說明

    參數

    string

    待編碼的原始字串。

    傳回值

    string

    Base 64 編碼後的字串。

  • base64_decode

    專案

    類型

    說明

    參數

    string

    待解碼的 Base64 字串。

    傳回值

    string

    解碼後的原始字串;輸入非法時返回Null 字元串 ""。

-- aGVsbG8= --
local data1 = aliwaf.util.base64_encode('hello')

-- hello --
local data2 = aliwaf.util.base64_decode('aGVsbG8=')

MD5/CRC/SHA

  • md5

    專案

    類型

    說明

    參數

    string

    待計算的原始字串。

    傳回值

    string

    32 位小寫十六進位格式的 MD5 摘要。

  • sha256

    專案

    類型

    說明

    參數

    string

    待計算的原始字串。

    傳回值

    string

    64 位元小寫十六進位格式的 SHA-256 摘要。

  • crc32

    專案

    類型

    說明

    參數

    string

    待計算的原始字串。

    傳回值

    integer

    CRC32 校正值(無符號 32 位整型)。

-- 5d41402abc4b2a76b9719d911017c592= --
local md5 = aliwaf.util.md5('hello')

-- 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 --
local sha = aliwaf.util.sha256('hello')

-- 3287646509 --
local crc = aliwaf.util.crc32('hello')

加解密(AES/DES)

  • evp_encrypt

    專案

    類型

    說明

    參數1

    string

    密碼編譯演算法類型,例如 "aes-128-cbc" 等。

    參數2

    string

    加密金鑰,二進位安全字串。

    參數3

    string

    初始化向量,可為空白字串 ""(不使用 IV 時)。

    參數4

    string

    待加密的明文。

    傳回值

    string

    加密後的密文;參數非法或加密失敗時返回Null 字元串 ""。

  • evp_decrypt

    專案

    類型

    說明

    參數1

    string

    解密演算法類型,需與加密時使用的演算法一致,如 "aes-128-cbc"。

    參數2

    string

    解密密鑰,需與加密時使用的密鑰一致。

    參數3

    string

    初始化向量,需與加密時使用的 IV 一致,可為空白字串 ""。

    參數4

    string

    待解密的密文。

    傳回值

    string

    解密後的明文;參數非法或解密失敗時返回Null 字元串 ""。

local data1 = aliwaf.util.evp_encrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', 'hello')

local data2 = aliwaf.util.evp_decrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', data1)

加簽驗簽(ES256)

  • es256_sign

    專案

    類型

    說明

    參數1

    string

    ES256 私密金鑰,PEM 格式。

    參數2

    string

    待簽名的未經處理資料。

    傳回值

    string

    簽名結果(二進位字串);參數非法或簽名失敗時返回Null 字元串 ""。

  • es256_verify

    專案

    類型

    說明

    參數1

    string

    ES256 公開金鑰,PEM 格式。

    參數2

    string

    簽名時使用的未經處理資料(需與簽名時一致)。

    參數3

    string

    待驗證的簽名值(由 es256_sign 產生)。

    傳回值

    boolean

    true 表示簽名驗證通過;false 表示驗證失敗或參數非法。

local sign = aliwaf.util.es256_sign('private_key-1234', 'hello')

local result = aliwaf.util.es256_verify('public_key-12345', 'hello', sign)

時間

專案

類型

說明

參數

-

-

傳回值

integer

當前毫秒級 UNIX 時間戳記。

-- 當前毫秒級時間戳記(整型)--
local timestamp = aliwaf.util.get_current_ms()

業務輔助函數

業務輔助函數用於Lua和WAF架構進行協作。

處置

專案

類型

說明

參數

-

-

傳回值

-

-

-- 根據預先選定的動作處置當前請求 --
aliwaf.func.punish()