Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

WPL 函数参考

本文档提供所有 WPL 函数的标准化参考。


📋 WPL 所有函数速查

预处理管道函数

函数说明示例
decode/base64对整行 Base64 解码|decode/base64|
decode/hex对整行十六进制解码|decode/hex|
unquote/unescape移除引号并还原转义|unquote/unescape|
plg_pipe/<name>自定义预处理扩展|plg_pipe/dayu|

选择器函数

函数说明示例
take(name)选择指定字段为活跃字段|take(name)|
last()选择最后一个字段为活跃字段|last()|

字段集操作函数(f_ 前缀)

函数说明示例
f_has(name)检查字段是否存在|f_has(status)|
f_chars_has(name, val)检查字段值等于字符串|f_chars_has(status, success)|
f_chars_not_has(name, val)检查字段值不等于字符串|f_chars_not_has(level, error)|
f_chars_in(name, [...])检查字段值在字符串列表|f_chars_in(method, [GET, POST])|
f_digit_has(name, num)检查字段值等于数字|f_digit_has(code, 200)|
f_digit_in(name, [...])检查字段值在数字列表|f_digit_in(status, [200, 201])|
f_ip_in(name, [...])检查 IP 在列表|f_ip_in(client_ip, [127.0.0.1])|

活跃字段操作函数

函数说明示例
has()检查活跃字段存在|take(name)| has()|
chars_has(val)检查活跃字段等于字符串|take(status)| chars_has(success)|
chars_not_has(val)检查活跃字段不等于字符串|take(level)| chars_not_has(error)|
chars_in([...])检查活跃字段在字符串列表|take(method)| chars_in([GET, POST])|
digit_has(num)检查活跃字段等于数字|take(code)| digit_has(200)|
digit_in([...])检查活跃字段在数字列表|take(status)| digit_in([200, 201])|
ip_in([...])检查活跃 IP 在列表|take(client_ip)| ip_in([127.0.0.1])|

转换函数

函数说明示例
json_unescape()JSON 反转义|take(message)| json_unescape()|
base64_decode()Base64 解码|take(payload)| base64_decode()|

常用场景速查

我想做什么使用方法
对整行 Base64 解码|decode/base64|
对整行十六进制解码|decode/hex|
移除引号和转义|unquote/unescape|
检查字段是否存在|f_has(field_name)|
检查字段值等于某字符串|f_chars_has(status, success)|
检查字段值在列表中|f_chars_in(method, [GET, POST])|
检查状态码是否为 200|f_digit_has(code, 200)|
检查 IP 是否在白名单|f_ip_in(client_ip, [127.0.0.1, 192.168.1.1])|
选择特定字段验证|take(status)| chars_has(ok)|
对字段 JSON 反转义|take(message)| json_unescape()|
对字段 Base64 解码|take(payload)| base64_decode()|
链式验证多个条件|f_has(method)| f_chars_in(method, [GET, POST])|

预处理管道函数

decode/base64

说明: 对整行输入进行 Base64 解码

语法:

|decode/base64|

参数:

示例:

rule base64_log {
  |decode/base64|
  (json(chars@user, digit@code))
}

输入(Base64):

eyJ1c2VyIjoiYWRtaW4iLCJjb2RlIjoyMDB9

解码后:

{"user":"admin","code":200}

注意:

  • 作用于整行原始输入
  • 必须在字段解析前执行
  • 解码失败会报错

decode/hex

说明: 对整行输入进行十六进制解码

语法:

|decode/hex|

参数:

示例:

rule hex_log {
  |decode/hex|
  (chars:data)
}

输入:

48656c6c6f20576f726c64

输出:

data: Hello World

unquote/unescape

说明: 移除外层引号并还原反斜杠转义

语法:

|unquote/unescape|

参数:

示例:

rule unescape_log {
  |unquote/unescape|
  (chars:message)
}

转换效果:

输入输出
\"hello\"hello
path\\to\\filepath\to\file

plg_pipe/

说明: 自定义预处理扩展

语法:

|plg_pipe/<name>|

参数: <name> - 注册的扩展名称

示例:

rule custom_preproc {
  |plg_pipe/dayu|
  (json(_@_origin, _@payload/packet_data))
}

注意:

  • 需要通过代码注册扩展
  • 注册接口:wpl::register_wpl_pipe!

选择器函数

take

说明: 选择指定字段为活跃字段

语法:

|take(<field_name>)|

参数:

  • field_name - 要选择的字段名

返回: 无(改变活跃字段状态)

示例:

rule take_example {
  (
    json(chars@name, digit@age)
    |take(name)              # 选择 name 为活跃字段
    |chars_has(admin)        # 验证 name 的值
  )
}

使用场景:

  • 需要对特定字段进行验证
  • 链式验证多个字段

last

说明: 选择最后一个字段为活跃字段

语法:

|last()|

参数:

返回: 无(改变活跃字段状态)

示例:

rule last_example {
  (
    json(chars@a, chars@b, chars@c)
    |last()                  # 选择 c 为活跃字段
    |chars_has(value)        # 验证 c 的值
  )
}

字段集操作函数

f_has

说明: 检查指定字段是否存在

语法:

|f_has(<field_name>)|

参数:

  • field_name - 要检查的字段名

返回: 布尔值(字段存在返回 true,否则失败)

示例:

rule check_field {
  (json |f_has(status) |f_has(message))
}

f_chars_has

说明: 检查指定字段值是否等于字符串

语法:

|f_chars_has(<field_name>, <value>)|

参数:

  • field_name - 字段名(或 _ 表示活跃字段)
  • value - 要匹配的字符串值

返回: 布尔值

示例:

rule check_string {
  (json |f_chars_has(status, success))
}

f_chars_not_has

说明: 检查指定字段值是否不等于字符串

语法:

|f_chars_not_has(<field_name>, <value>)|

参数:

  • field_name - 字段名
  • value - 不应匹配的字符串值

返回: 布尔值

示例:

rule exclude_error {
  (json |f_chars_not_has(level, error))
}

f_chars_in

说明: 检查指定字段值是否在字符串列表中

语法:

|f_chars_in(<field_name>, [<value1>, <value2>, ...])|

参数:

  • field_name - 字段名
  • [...] - 允许的字符串值列表

返回: 布尔值

示例:

rule check_method {
  (json |f_chars_in(method, [GET, POST, PUT]))
}

f_digit_has

说明: 检查指定字段数值是否等于指定数字

语法:

|f_digit_has(<field_name>, <number>)|

参数:

  • field_name - 字段名
  • number - 要匹配的数字

返回: 布尔值

示例:

rule check_status {
  (json |f_digit_has(code, 200))
}

f_digit_in

说明: 检查指定字段数值是否在数字列表中

语法:

|f_digit_in(<field_name>, [<num1>, <num2>, ...])|

参数:

  • field_name - 字段名
  • [...] - 允许的数字值列表

返回: 布尔值

示例:

rule check_success {
  (json |f_digit_in(status, [200, 201, 204]))
}

f_ip_in

说明: 检查指定 IP 字段是否在 IP 列表中

语法:

|f_ip_in(<field_name>, [<ip1>, <ip2>, ...])|

参数:

  • field_name - 字段名
  • [...] - 允许的 IP 地址列表(支持 IPv4/IPv6)

返回: 布尔值

示例:

rule check_trusted {
  (json |f_ip_in(client_ip, [127.0.0.1, 192.168.1.1]))
}

活跃字段操作函数

has

说明: 检查活跃字段是否存在

语法:

|has()|

参数:

返回: 布尔值

示例:

rule check_active {
  (
    json(chars@name)
    |take(name)
    |has()                   # 检查 name 是否存在
  )
}

chars_has

说明: 检查活跃字段值是否等于指定字符串

语法:

|chars_has(<value>)|

参数:

  • value - 要匹配的字符串值

返回: 布尔值

示例:

rule check_value {
  (
    json(chars@status)
    |take(status)
    |chars_has(success)
  )
}

chars_not_has

说明: 检查活跃字段值是否不等于指定字符串

语法:

|chars_not_has(<value>)|

参数:

  • value - 不应匹配的字符串值

返回: 布尔值

示例:

rule exclude_value {
  (
    json(chars@level)
    |take(level)
    |chars_not_has(error)
  )
}

chars_in

说明: 检查活跃字段值是否在字符串列表中

语法:

|chars_in([<value1>, <value2>, ...])|

参数:

  • [...] - 允许的字符串值列表

返回: 布尔值

示例:

rule check_method {
  (
    json(chars@method)
    |take(method)
    |chars_in([GET, POST, PUT])
  )
}

digit_has

说明: 检查活跃字段数值是否等于指定数字

语法:

|digit_has(<number>)|

参数:

  • number - 要匹配的数字

返回: 布尔值

示例:

rule check_code {
  (
    json(digit@code)
    |take(code)
    |digit_has(200)
  )
}

digit_in

说明: 检查活跃字段数值是否在数字列表中

语法:

|digit_in([<num1>, <num2>, ...])|

参数:

  • [...] - 允许的数字值列表

返回: 布尔值

示例:

rule check_success {
  (
    json(digit@status)
    |take(status)
    |digit_in([200, 201, 204])
  )
}

ip_in

说明: 检查活跃 IP 字段是否在 IP 列表中

语法:

|ip_in([<ip1>, <ip2>, ...])|

参数:

  • [...] - 允许的 IP 地址列表(支持 IPv4/IPv6)

返回: 布尔值

示例:

rule check_client {
  (
    json(ip@client_ip)
    |take(client_ip)
    |ip_in([127.0.0.1, 192.168.1.1])
  )
}

转换函数

json_unescape

说明: 对活跃字段进行 JSON 反转义

语法:

|json_unescape()|

参数:

转换效果:

输入输出
hello\\nworldhello + 换行 + world
path\\\\topath\to
say\\\"hi\\\"say"hi"

示例:

rule parse_json_log {
  (
    json(chars@message)
    |take(message)
    |json_unescape()
  )
}

base64_decode

说明: 对活跃字段进行 Base64 解码

语法:

|base64_decode()|

参数:

转换效果:

输入输出
aGVsbG8=hello
Zm9vYmFyfoobar

示例:

rule decode_payload {
  (
    json(chars@payload)
    |take(payload)
    |base64_decode()
  )
}

📊 函数对照表

字段集 vs 活跃字段

功能字段集操作(f_ 前缀)活跃字段操作(无前缀)
检查存在f_has(name)take(name) | has()
字符串相等f_chars_has(name, val)take(name) | chars_has(val)
字符串不等f_chars_not_has(name, val)take(name) | chars_not_has(val)
字符串在列表f_chars_in(name, [a, b])take(name) | chars_in([a, b])
数字相等f_digit_has(name, 200)take(name) | digit_has(200)
数字在列表f_digit_in(name, [200, 201])take(name) | digit_in([200, 201])
IP 在列表f_ip_in(name, [1.1.1.1])take(name) | ip_in([1.1.1.1])

💡 使用模式

链式调用

rule chain {
  (json
    |f_has(method)
    |f_chars_in(method, [GET, POST])
    |f_digit_in(status, [200, 201])
    |f_ip_in(client_ip, [10.0.0.1])
  )
}

选择器 + 验证

rule selector {
  (json(chars@name, digit@age)
    |take(name)
    |chars_has(admin)
    |take(age)
    |digit_in([18, 19, 20])
  )
}

预处理 + 字段级管道

rule full {
  |decode/base64|                      # 预处理:整行解码
  (json |f_has(name) |f_digit_in(age, [18, 25]))  # 字段级:验证
}

相关文档