跳转至

编辑自定义控制规则

1. 接口描述

接口请求路径:POST /prod-api/waf/wafv3/custom/rules/modifyCustomRule

modifyCustomRule 同时用于创建与编辑。创建时省略 customRuleId(或不传 / 为 null),服务端将新增规则并自动排到末尾后返回新规则 ID;编辑时必传已有 customRuleId。匹配条件、运算符与动作枚举见 查询条件参数ruleClassdefault 的定制规则不可编辑。

Token 获取方式见 密钥鉴权

2. 输入参数

以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见 公共请求参数

参数名称 必选 类型 描述
wafId Long 所属策略组 ID。示例值:22
ruleMessage String 规则名称,最长 30 字符;不可含 \'"。示例值:sql注入攻击 包含
status String 启用状态。取值:enable(启用)、disable(关闭)。示例值:enable
rules CustomRule 规则内容
customRuleId Long 创建时省略或为 null;传入已有 ID 则为编辑。示例值:61
sort Integer 排序权重;新建时由服务端自动排到末尾

3. 输出参数

参数名称 类型 描述
code Integer 状态码。示例值:200
msg String 提示信息。示例值:成功
data Long 保存后的 customRuleId(新建为新 ID,编辑为原 ID)。示例值:61

4. 示例

示例1 创建拦截规则

输入示例

{
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [
      [
        {
          "target": "CHECK_REQUEST_HEADERS_NAMES",
          "operator": "INT_EQ",
          "name": "APP",
          "values": ["0"]
        },
        {
          "target": "IP_SRC",
          "operator": "IP_IN_LIST",
          "name": "IP_SRC",
          "values": ["52"]
        }
      ]
    ],
    "action": {
      "action": "DENY",
      "parameters": [
        { "name": "log", "values": ["log"] }
      ]
    }
  }
}

代码调用

请将 {登录域名}token 替换为实际值。

curl -X POST 'https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.xxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [[{
      "target": "CHECK_REQUEST_HEADERS_NAMES",
      "operator": "INT_EQ",
      "name": "APP",
      "values": ["0"]
    },{
      "target": "IP_SRC",
      "operator": "IP_IN_LIST",
      "name": "IP_SRC",
      "values": ["52"]
    }]],
    "action": {
      "action": "DENY",
      "parameters": [
        {"name": "log", "values": ["log"]}
      ]
    }
  }
}'
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class ModifyCustomRuleTest {

    public static void main(String[] args) throws Exception {
        String url = "https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule";
        String token = "eyJhbGciOiJIUzUxMiJ9.xxxxxx";

        String requestBody = "{"
                + "\"ruleMessage\":\"sql注入攻击 包含\","
                + "\"status\":\"enable\","
                + "\"wafId\":22,"
                + "\"rules\":{"
                + "\"conditions\":[[{"
                + "\"target\":\"CHECK_REQUEST_HEADERS_NAMES\",\"operator\":\"INT_EQ\","
                + "\"name\":\"APP\",\"values\":[\"0\"]"
                + "},{"
                + "\"target\":\"IP_SRC\",\"operator\":\"IP_IN_LIST\","
                + "\"name\":\"IP_SRC\",\"values\":[\"52\"]"
                + "}]],"
                + "\"action\":{"
                + "\"action\":\"DENY\","
                + "\"parameters\":[{\"name\":\"log\",\"values\":[\"log\"]}]"
                + "}"
                + "}"
                + "}";

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Authorization", "Bearer " + token);
            httpPost.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON));

            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int statusCode = response.getStatusLine().getStatusCode();
                String body = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("Status Code: " + statusCode);
                System.out.println("Body: " + body);
            }
        }
    }
}
package main

import (
    "bytes"
    "fmt"
    "io"
    "net/http"
)

func main() {
    url := "https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule"
    token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"

    requestBody := []byte(`{
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [[{
      "target": "CHECK_REQUEST_HEADERS_NAMES",
      "operator": "INT_EQ",
      "name": "APP",
      "values": ["0"]
    },{
      "target": "IP_SRC",
      "operator": "IP_IN_LIST",
      "name": "IP_SRC",
      "values": ["52"]
    }]],
    "action": {
      "action": "DENY",
      "parameters": [
        {"name": "log", "values": ["log"]}
      ]
    }
  }
}`)

    req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(requestBody))
    if err != nil {
        panic(err)
    }
    req.Header.Set("Authorization", "Bearer "+token)
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println("Status Code:", resp.StatusCode)
    fmt.Println("Body:", string(body))
}

输出示例

{
  "msg": "成功",
  "code": 200,
  "data": 61
}

示例2 编辑已有规则

输入示例

{
  "customRuleId": 61,
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [
      [
        {
          "conditionId": 120000456,
          "target": "CHECK_REQUEST_HEADERS_NAMES",
          "operator": "INT_EQ",
          "name": "APP",
          "values": ["0"]
        },
        {
          "conditionId": 120000457,
          "target": "IP_SRC",
          "operator": "IP_IN_LIST",
          "name": "IP_SRC",
          "values": ["52"]
        }
      ]
    ],
    "action": {
      "action": "DENY",
      "parameters": [
        { "name": "log", "values": ["log"] }
      ]
    }
  }
}

代码调用

请将 {登录域名}token 替换为实际值。

curl -X POST 'https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.xxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "customRuleId": 61,
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [[{
      "conditionId": 120000456,
      "target": "CHECK_REQUEST_HEADERS_NAMES",
      "operator": "INT_EQ",
      "name": "APP",
      "values": ["0"]
    },{
      "conditionId": 120000457,
      "target": "IP_SRC",
      "operator": "IP_IN_LIST",
      "name": "IP_SRC",
      "values": ["52"]
    }]],
    "action": {
      "action": "DENY",
      "parameters": [
        {"name": "log", "values": ["log"]}
      ]
    }
  }
}'
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class ModifyCustomRuleEditTest {

    public static void main(String[] args) throws Exception {
        String url = "https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule";
        String token = "eyJhbGciOiJIUzUxMiJ9.xxxxxx";

        String requestBody = "{"
                + "\"customRuleId\":61,"
                + "\"ruleMessage\":\"sql注入攻击 包含\","
                + "\"status\":\"enable\","
                + "\"wafId\":22,"
                + "\"rules\":{"
                + "\"conditions\":[[{"
                + "\"conditionId\":120000456,"
                + "\"target\":\"CHECK_REQUEST_HEADERS_NAMES\",\"operator\":\"INT_EQ\","
                + "\"name\":\"APP\",\"values\":[\"0\"]"
                + "},{"
                + "\"conditionId\":120000457,"
                + "\"target\":\"IP_SRC\",\"operator\":\"IP_IN_LIST\","
                + "\"name\":\"IP_SRC\",\"values\":[\"52\"]"
                + "}]],"
                + "\"action\":{"
                + "\"action\":\"DENY\","
                + "\"parameters\":[{\"name\":\"log\",\"values\":[\"log\"]}]"
                + "}"
                + "}"
                + "}";

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Authorization", "Bearer " + token);
            httpPost.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON));

            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int statusCode = response.getStatusLine().getStatusCode();
                String body = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("Status Code: " + statusCode);
                System.out.println("Body: " + body);
            }
        }
    }
}
package main

import (
    "bytes"
    "fmt"
    "io"
    "net/http"
)

func main() {
    url := "https://{登录域名}/prod-api/waf/wafv3/custom/rules/modifyCustomRule"
    token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"

    requestBody := []byte(`{
  "customRuleId": 61,
  "ruleMessage": "sql注入攻击 包含",
  "status": "enable",
  "wafId": 22,
  "rules": {
    "conditions": [[{
      "conditionId": 120000456,
      "target": "CHECK_REQUEST_HEADERS_NAMES",
      "operator": "INT_EQ",
      "name": "APP",
      "values": ["0"]
    },{
      "conditionId": 120000457,
      "target": "IP_SRC",
      "operator": "IP_IN_LIST",
      "name": "IP_SRC",
      "values": ["52"]
    }]],
    "action": {
      "action": "DENY",
      "parameters": [
        {"name": "log", "values": ["log"]}
      ]
    }
  }
}`)

    req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(requestBody))
    if err != nil {
        panic(err)
    }
    req.Header.Set("Authorization", "Bearer "+token)
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println("Status Code:", resp.StatusCode)
    fmt.Println("Body:", string(body))
}

输出示例

{
  "msg": "成功",
  "code": 200,
  "data": 61
}

5. 错误码

HTTP 状态码 / 业务提示 描述
200 成功
401 未鉴权或 Token 无效
403 无权限
规则描述不能为空 Controller 校验:ruleMessage 为空
规则名称[ruleName]不能为空 校验注解:ruleMessage 为空
执行动作不能为空 rules.action 为空
失败,定制规则无法编辑 ruleClassdefault
规则描述中不能包含特殊字符 ruleMessage\'"
状态[status]只能为disable或enable status 取值非法
规则状态[status]不能为空 未传 status
[wafId]不能为空 未传 wafId
规则名称[ruleMessage]不能超过30位 名称超长
请输入至少一个条件 conditions 为空
只能输入一个条件集合 conditions 外层数组超过 1 组
无效的target 条件 target 非法
无效的target:{0} target 不在枚举中
无效的Operator:{0} operator 非法
无效的action:{0} 动作编码非法
值不能为空 条件 values 为空
规则ID不能为空 条件持久化 ID 无效
更新失败,请确认提交信息是否正确 持久化失败
未定义相关数据列表,请先创建相关数据列表后再操作 数据集合 ID 无效
字段{0}的匹配内容只能有一个值 单值运算符传入多个值
字段{0}的匹配内容,暂时不支持 运算符暂不支持
字段{0}的name参数错误 nametarget 不一致(WAF11001)
name的格式只能包含字母、数字、下划线、点和减号 name 格式非法(WAF11002)
字段{0}的名称不能为空 需自定义字段名时 name 为空(WAF11003)
字段{0}的运算符{1}是无效的 运算符不适用于该 target(WAF11004)
字段{0}的匹配内容不能为空 匹配值为空(WAF11005)
字段{0}的匹配内容个数不能大于300 匹配值超过 300 个(WAF11006)
字段{0}的匹配内容,请勿输入重复的值 匹配值重复(WAF11007)
字段{0}的匹配内容,最大输入长度不能大于1000 单值长度超过 1000(WAF11008)
字段{0}的匹配内容,存在无效的国家地区编码 国家/地区编码无效(WAF11009)
字段{0}的匹配内容{1}存在无效的值 枚举值无效(WAF11010)
执行操作参数不能为空 动作 parameters 为空
执行操作参数[log]不能为空 缺少 log 参数
无效的日志操作参数[{0}],log只能为:{1} log 取值不在动作允许列表
重定向的[url]不能为空 REDIRECT 缺少 url
重定向的[statusCode]不能为空 REDIRECT 缺少 statusCode
无效的状态码参数[{0}],只能为:{1} statusCode301/302/303/307
加白的[ruleIds]规则不能为空 WHITE_RULE_IDS 缺少 whiteRuleIds
加白的[ruleIds]规则格式错误,只能为单个规则ID或ID范围 whiteRuleIds 格式非法
加白的[ruleIds]规则格式错误,不是一个有效的值 whiteRuleIds 非正整数
加白的[ruleIds]规则格式错误,不是一个有效的ID范围 范围起始大于结束
跳过规则[skipRules]不能为空 SKIP_RULES 缺少 skipRules
无效的跳过规则类别 skipRules 取值非法
值:[{0}}]中不能包含特殊字符{1} 重定向 URL 含 %(WAF11000)

6. 数据模型

CustomRule

自定义规则的匹配条件与命中动作。

参数名称 必选 类型 描述
action CustomRuleAction 命中后动作
conditions [CustomRuleCondition] 条件组二维数组;组内为与关系。当前仅支持一组

CustomRuleCondition

单条匹配条件。

参数名称 必选 类型 描述
target String 匹配维度,与 查询条件参数 一致。示例值:IP_SRC
operator String 运算符,如 EQIP_IN_LISTINT_EQ。示例值:IP_IN_LIST
name String 维度名或子字段名(如请求头名);为空时服务端按 target 填充。示例值:IP_SRC
values Array of String 比较取值;数据集合填 dataListId 字符串。示例值:["52"]
conditionId Long 已有条件的持久化 ID;新建条件可省略

CustomRuleAction

命中后执行动作。

参数名称 必选 类型 描述
action String 动作编码。取值:DENY(拦截)、LOG(仅记录不拦截)、SKIP_RULES(跳过规则)、WHITE_RULE_IDS(加白规则 ID)、REDIRECT(重定向)。示例值:DENY
parameters [CustomRuleActionParameters] 动作参数;DENY/LOG 可不传(服务端固定记日志)

CustomRuleActionParameters

动作参数项。

参数名称 必选 类型 描述
name String 参数键。常见:logurlstatusCodeskipRuleswhiteRuleIds
values Array of String 参数值列表

常用动作参数组装:

  • DENY / LOG:通常仅 log,取值:log
  • SKIP_RULESlog(取值:log / nolog)+ skipRules(取值:remainRuleslimitRulescustodyRules
  • WHITE_RULE_IDSlog(取值:log / nolog)+ whiteRuleIds(单个 ID 或 N-M 范围)
  • REDIRECTlog + url + statusCode(取值:301 / 302 / 303 / 307

SKIP_RULES 示例:

{
  "action": "SKIP_RULES",
  "parameters": [
    { "name": "log", "values": ["log"] },
    { "name": "skipRules", "values": ["remainRules", "limitRules", "custodyRules"] }
  ]
}

REDIRECT 示例:

{
  "action": "REDIRECT",
  "parameters": [
    { "name": "log", "values": ["log"] },
    { "name": "url", "values": ["https://example.com/blocked"] },
    { "name": "statusCode", "values": ["302"] }
  ]
}