编辑自定义限速规则¶
1. 接口描述¶
接口请求路径:POST /prod-api/waf/wafv3/limit/rules/modifyLimitRule
modifyLimitRule 同时用于创建与编辑。创建时省略 limitRuleId(或不传 / 为 null),服务端将新增规则并返回新规则 ID;编辑时必传已有 limitRuleId。匹配条件、相同特征与运算符见 查询条件参数。
与自定义控制规则的主要区别:conditions 为一维数组(全部为与);须配置 characteristics(计数维度,1–10 项);命中动作仅支持 DENY / LOG,且须配置 limitAccess、limitTime、parameters.behavior(behavior=all 时另需 duration)。
Token 获取方式见 密钥鉴权。
2. 输入参数¶
以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见 公共请求参数。
| 参数名称 | 必选 | 类型 | 描述 |
|---|---|---|---|
| wafId | 是 | Long | 所属策略组 ID 示例值: 22 |
| ruleMessage | 是 | String | 规则名称,最长 30 字符 示例值: 单IP访问限速 |
| status | 是 | String | 启用状态,支持以下值:enable:启用disable:关闭示例值: enable |
| rules | 是 | Object | 规则内容,见 LimitRuleVO |
| limitRuleId | 否 | Long | 创建时省略或为 null;传入已有 ID 则为编辑示例值: 15 |
| sort | 否 | Integer | 排序权重 |
3. 示例¶
示例1 创建限速规则(behavior=all)¶
输入示例¶
{
"ruleMessage": "11",
"status": "enable",
"wafId": 22,
"rules": {
"characteristics": [
{ "target": "IP_SRC", "name": "IP_SRC" }
],
"conditions": [
{
"target": "IP_SRC",
"operator": "IP_IN_LIST",
"name": "IP_SRC",
"values": ["52"]
}
],
"action": {
"action": "DENY",
"limitAccess": 12,
"limitTime": 10,
"parameters": {
"behavior": "all",
"duration": 10
}
}
}
}
上例含义:源 IP 在数据集合 52 内时参与统计;按 IP 聚合计数;10 秒内超过 12 次触发;触发后在 10 秒内拦截全部匹配请求。
代码调用¶
请将 {登录域名}、token 替换为实际值。
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 ModifyLimitRuleTest {
public static void main(String[] args) throws Exception {
String url = "https://{登录域名}/prod-api/waf/wafv3/limit/rules/modifyLimitRule";
String token = "eyJhbGciOiJIUzUxMiJ9.xxxxxx";
String requestBody = "{"
+ "\"ruleMessage\":\"单IP访问限速\","
+ "\"status\":\"enable\","
+ "\"wafId\":22,"
+ "\"rules\":{"
+ "\"characteristics\":[{\"target\":\"IP_SRC\",\"name\":\"IP_SRC\"}],"
+ "\"conditions\":[{"
+ "\"target\":\"IP_SRC\",\"operator\":\"IP_IN_LIST\","
+ "\"name\":\"IP_SRC\",\"values\":[\"52\"]"
+ "}],"
+ "\"action\":{"
+ "\"action\":\"DENY\",\"limitAccess\":12,\"limitTime\":10,"
+ "\"parameters\":{\"behavior\":\"excess\"}"
+ "}"
+ "}"
+ "}";
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/limit/rules/modifyLimitRule"
token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"
requestBody := []byte(`{
"ruleMessage": "单IP访问限速",
"status": "enable",
"wafId": 22,
"rules": {
"characteristics": [
{"target": "IP_SRC", "name": "IP_SRC"}
],
"conditions": [{
"target": "IP_SRC",
"operator": "IP_IN_LIST",
"name": "IP_SRC",
"values": ["52"]
}],
"action": {
"action": "DENY",
"limitAccess": 12,
"limitTime": 10,
"parameters": {"behavior": "excess"}
}
}
}`)
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))
}
输出示例¶
示例2 编辑已有规则(behavior=excess)¶
{
"limitRuleId": 15,
"ruleMessage": "单IP超限仅拦超出部分",
"status": "enable",
"wafId": 22,
"rules": {
"characteristics": [
{ "target": "IP_SRC", "name": "IP_SRC" }
],
"conditions": [
{
"conditionId": 120000501,
"target": "IP_SRC",
"operator": "IP_IN_LIST",
"name": "IP_SRC",
"values": ["52"]
}
],
"action": {
"action": "DENY",
"limitAccess": 12,
"limitTime": 10,
"parameters": {
"behavior": "excess"
}
}
}
}
4. 输出参数¶
| 参数名称 | 类型 | 描述 |
|---|---|---|
| code | Integer | 状态码。示例值:200 |
| msg | String | 提示信息。示例值:成功 |
| data | Long | 保存后的 limitRuleId(新建为新 ID,编辑为原 ID)。示例值:15 |
5. 错误码¶
| HTTP 状态码 / 业务提示 | 描述 |
|---|---|
| 200 | 成功 |
| 401 | 未鉴权或 Token 无效 |
| 403 | 无权限 |
| 规则描述不能为空 | ruleMessage 为空 |
| 执行动作不能为空 | rules.action 为空 |
| 无效的wafId | 策略组不存在或不属于当前用户 |
| [wafId]不能为空 | 未传 wafId |
| 规则名称[ruleMessage]不能超过30位 | 名称超长 |
| 状态[status]只能为disable或enable | status 取值非法 |
| 请输入至少一个条件 | conditions 为空 |
| 请输入至少指定一个相同特征 | characteristics 为空 |
| 至多只能指定10个特征 | 特征超过 10 项 |
| 访问频次不能为空 | 未传 limitAccess |
| 时间周期不能为空,并且需大于0 | limitTime 非法 |
| 执行动作只能为LOG、DENY | action 取值非法 |
| 执行动作参数列表不能为空 | parameters 为空 |
| 执行动作参数[behavior]不能为空,且只能为excess、all | behavior 非法 |
| 执行动作参数[duration]不能为空,且范围在1-86400 | behavior=all 时 duration 非法 |
| 无效的target | target 非法 |
| name的格式只能包含字母、数字、下划线、点和减号 | name 格式非法 |
| 更新失败,请确认提交信息是否正确 | 持久化失败 |
| 未定义相关数据列表,请先创建相关数据列表后再操作 | 数据集合 ID 无效 |
| 字段…的匹配内容… | 条件值校验失败(长度、重复、枚举等) |
6. 数据模型¶
LimitRuleVO¶
| 参数名称 | 类型 | 描述 |
|---|---|---|
| characteristics | Array | 相同特征(计数维度),1–10 项 |
| characteristics[].target | String | 特征编码,与 describeParameter 中 target 一致。示例值:IP_SRC |
| characteristics[].name | String | 子字段名;多数与 target 相同;仅允许 [a-zA-Z0-9_.-]+ |
| conditions | Array | 匹配条件一维数组,全部为与;至少 1 条 |
| conditions[].target | String | 匹配维度。示例值:IP_SRC |
| conditions[].operator | String | 运算符,如 IP_IN_LIST、EQ |
| conditions[].name | String | 维度名;为空时服务端可按 target 填充 |
| conditions[].values | Array of String | 比较取值;数据集合填 dataListId |
| conditions[].conditionId | Long | 编辑时建议带回;新建条件可省略 |
| action | Object | 限速动作 |
| action.action | String | 动作编码,支持以下值:DENY:拦截LOG:仅记录不拦截示例值: DENY |
| action.limitAccess | Integer | 统计时间窗内允许的最大请求次数。示例值:12 |
| action.limitTime | Integer | 统计时间窗长度,单位秒,须 > 0。示例值:10 |
| action.parameters | Object | 行为参数 |
| action.parameters.behavior | String | 支持以下值:excess:仅对超出 limitAccess 的请求执行动作all:达到阈值后在 duration 秒内对全部匹配请求执行动作示例值: all |
| action.parameters.duration | Integer | 仅当 behavior=all 时必填;持续阻断秒数,范围 1–86400。示例值:10 |
说明:limitTime 是计数窗口;duration 是 behavior=all 时的惩罚窗口,二者单位均为秒,含义不同。