{{i18nTranslate('_layout.t11')}} {{i18nGetLang()==='zh' ? 'EN' : '中文'}}

# WAF规则

## 规则示例

### 只允许某些特定来源的网站访问

这里面就有两个规则：一个是我们允许所有来源为空的访问（也就是用户直接访问网站），第二个就是允许特定域名的来源访问，所以我们要添加的规则就是阻止以下条件的访问：

1. 来源不为空
2. 来源不是我们允许的域名

在规则集里添加的规则如下：

- 规则：
  1. 规则1
     - 参数： `请求来源 - [refererOrigin]`
     - 操作符： `正则不匹配`
     - 对比值： `a\.com|b\.c\.d\.com`
     - 这里写的是你允许的域名列表
     - 要符合基本的正则表达式语法
  2. 规则2
     - 参数： `请求来源 - [refererOrigin]`
     - 操作符：`字符串不等于`
     - 对比值：不填留空
- 规则之间的关系：`和(And)`
- 执行动作：`网页网页（PAGE）`

### 禁止访问特定的URL

比如一个网站禁止访问 `/hello.html`：

- 参数：`请求路径 - [requestPath]`
- 操作符：`字符串等于`
- 对比值：`/hello.html`
- 执行动作：`网页网页（PAGE）`
  - 状态码：`403`

设置后，访问 `/hello.html`、`/hello.html?v=123` 之类的URL会显示403，而访问其他URL则正常。

### 只允许访问特定的URL

比如一个网站只允许访问 `/hello.html` ，访问其他页面时提示`403`：

- 参数：`请求路径 - [requestPath]`
- 操作符：`字符串不等于`
- 对比值：`/hello.html`
- 执行动作：`网页网页（PAGE）`
  - 状态码：`403`

设置后，访问 `/hello.html`、`/hello.html?v=123` 之类的URL是正常的，访问 `/world.html` 会显示403。

### 只允许访问特定的目录

比如一个网站只允许访问 `/images/` ，访问其他页面时提示`403`：

- 参数：`请求路径 - [requestPath]`
- 操作符：`正则不匹配`
- 对比值：`^/images/` （其中 `^` 在正则中表示开头）
- 执行动作：`网页网页（PAGE）`
  - 状态码：`403`

设置后，访问 `/images/test.jpg`、`/images/test.jpg?v=123` 之类的URL是正常的，访问 `/images2/test.jpg` 会显示403。

## 编解码

编解码可以对输入的参数值进行二次处理后，再跟对比值进行对比。以下是几个示例：

### 示例1：判断某个参数值的长度必须大于100

如果要想判断某个参数值的长度大于100，可以使用编解码的”计算长度”，规则内容如下：

- 参数：`单个URL参数值-[arg]`
- 参数名：name （比如要判断的是URL中的参数name）
- 编解码：计算长度
- 操作符：数值大于
- 对比值：100

这样当用户输入的name参数长度大于100的时候就会匹配到此规则。

### 示例2：判断某个用户输入的某个Base64内容必须包含某个字符串

当用户输入Base64内容的时候，使用常规的手段无法进行对比，所以可以使用编解码中的”BASE64Decode”，规则内容如下：

- 参数：`单个URL参数值-[arg]`
- 参数名：name （比如要判断的是URL中的参数name）
- 编解码：BASE64Decode
- 操作符：包含字符串
- 对比值：HelloWorld

这样当用户输入类似于”SGVsbG9Xb3JsZA==“的内容时，就能匹配到该规则。

### 示例3：判断经过转义的URL是否匹配某个规则

如果用户输入的内容中是经过转义的，可能会对我们的判断有所影响，比如：

    id%3D%3B+DELETE+FROM+abc

针对这种情况，我们可以使用编解码中的URLDecode来对输入值进行解码后再对比：

- 参数：`所有URL参数组合-[args]`
- 参数名：name （比如要判断的是URL中的参数name）
- 编解码：URLDecode
- 操作符：正则匹配
- 对比值：DELETE FROM

经过解码后，上面的一段内容会被解码成：

    id=; DELETE FROM abc

所以就会和我们写的正则相匹配。
{{i18nTranslate('_layout.t27')}}
{{i18nTranslate('_layout.t12')}}