擴充外掛程式功能支援使用者編寫自訂 Lua 指令碼,深度介入 Web 應用程式的請求處理流程,從而實現 WAF 原生規則之外的個人化安全邏輯。通過靈活配置指令碼與參數,可以輕鬆滿足複雜的業務定製需求,極大提升安全防護的適配性與自由度。
開通擴充外掛程式功能
如需使用擴充外掛程式功能,需按以下步驟完成開通:
適用版本:僅訂用帳戶WAF企業版、旗艦版與隨用隨付版支援開通此功能。
計費說明:該功能為收費服務,具體計費方式如下:
隨用隨付版:無需預先購買即可直接使用,系統將根據實際使用方式產生額外費用。
訂用帳戶版:需先完成購買方可使用。
-
登入Web Application Firewall3.0控制台。在頂部功能表列,選擇WAF執行個體的資源群組和地區(中國內地、非中國內地)。
在左側導覽列,選擇。
單擊“立即購買”並根據頁面指引完成開通。
建立擴充外掛程式
在扩展插件頁面,單擊新建扩展插件,然後完成以下參數配置。
基礎資訊:填寫便於識別的插件名称與插件描述。
插件代码:在此處編寫 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 要求流量。單擊添加参数,輸入參數名(如
method、uri、args等)及其對應的参数值。樣本:設定
method為POST,uri為/login,以測試登入介面的防護邏輯。
执行结果:單擊运行调试,系統將根據類比流量執行指令碼,然後查看右側的执行结果面板。若結果為失敗,請根據具體的錯誤資訊提示修正代碼。
後續步驟
擴充外掛程式建立完成後,需要在自訂規則防護模板中進行引用,具體資訊,請參見自訂規則。
日常營運
在扩展插件頁面,支援進行以下操作:
查看外掛程式列表:頁面展示所有擴充外掛程式。可在列表上方的搜尋方塊中輸入外掛程式名稱,快速檢索目標外掛程式。
查看關聯防護規則:定位至目標外掛程式,點擊关联规则列的
表徵圖,即可展示其關聯的防護規則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()