# UWAF 规则

UWAF 本身包含多种类型（协议违规、注入攻击、跨站脚本、漏洞攻击、命令执行等）的默认防护规则，除了这些类型中已有的规则，您还可以自定义添加防护规则已实现对攻击的精准拦截和放行某些请求。

> 各类规则的优先级参见[规则优先级](/docs/uewaf/features/rule/mode#规则优先级)。

## 规则列表

规则有不同的优先级，默认规则处于最低优先级，无法调整优先级，但可以自行选择开启或关闭某一类型的规则判断。自定义规则的优先级可以调整，位于规则列表最上面的规则具有最高优先级，往下规则优先级依次降低。

- 可以上调或降低规则的优先级，列表上面的规则优先级高于下面的规则；
- 优先级高的规则如果与优先级低的规则冲突，则以优先级高的为准；
- 系统的默认规则优先级是最低的，且无法进行调整。

<!-- image-todo -->

## 添加规则

规则由规则名称、匹配动作、风险等级、风险类型、匹配条件组成。阻断模式和告警模式下，若规则的匹配动作为拦截，请求命中某条自定义规则则会记录一条攻击日志，日志详情可以在[攻击详情](/docs/uewaf/features/report/attack_details)中查看；若规则的匹配动作为放行，请求命中此规则的话不会产生攻击日志。**告警模式下拦截请求仅会记录攻击日志，但不会拦截请求**。

<!-- image-todo -->

### 规则参数说明

| 参数     | 说明                                                                                                                                                                               |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 规则名称 | 自定义规则的名称，可以为任意中英文字符                                                                                                                                             |
| 匹配动作 | 拦截或者放行。拦截会记录攻击日志，放行不会记录攻击日志                                                                                                                             |
| 风险等级 | 高风险、中风险或者低风险，用于标识规则的风险级别                                                                                                                                   |
| 风险类型 | 标识规则的类型，可选值：恶意扫描、协议畸形、越权访问、信息泄漏、WebShell、漏洞攻击、跨站脚本、CC 攻击、注入攻击、命令执行、其他攻击                                                |
| 匹配条件 | 由匹配字段、逻辑符、匹配内容和参数解码组成，多个条件之间的逻辑为且，即条件都满足时，才能命中规则。详细说明见文档下方[匹配条件说明](/docs/uewaf/features/rule/uwaf_rule#匹配条件说明) |

### 匹配条件说明

匹配字段说明及其与逻辑符的对应关系如下：

| 匹配字段       | 说明                                                                           | 逻辑符                                                                     |
| -------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| 来源 IP        | 请求客户端的源 IP，若开启了【WAF 前是否具有代理】，则取指定字段的 IP 作为源 IP | 属于、不属于（CIDR 格式）；等于、不等于                                    |
| Referer        | 在不同网页跳转时，会附带源页面的链接地址，告诉服务器是从哪个页面链接过来的     | 包含、不包含；等于、不等于；长度大于、小于；不存在；正则；多行、非多行匹配 |
| 请求 UA        | 用于标识请求客户端的字符串，即 HTTP 请求的 User-Agent 字段                     | 包含、不包含；等于、不等于；长度大于、小于；正则；多行、非多行匹配         |
| 请求路径       | 客户端提交请求路以访问服务端的指定资源，例如首页的请求路径为 `/`               | 包含、不包含；等于、不等于；长度大于、小于；正则；多行、非多行匹配         |
| 请求方法       | 请求的方法，如 `GET`, `POST`                                                   | 包含、不包含；等于、不等于；长度大于、小于；正则；多行、非多行匹配         |
| 请求内容       | 请求的 Body 部分的内容                                                         | 包含、不包含；等于、不等于；长度大于、小于；正则；多行、非多行匹配         |
| URL 查询参数\* | URL 中的参数，例如 `?a=1&b=2` ，则 URL 查询参数为 `a, b` ，参数值为 `1, 2`     | 包含、不包含；等于、不等于；长度大于、小于；不存在；正则；多行、非多行匹配 |
| 请求 Cookie\*  | 客户端请求的 Cookie，Cookie 用于记录某些网页配置或向服务器标识身份             | 包含、不包含；等于、不等于；长度大于、小于；不存在；正则；多行、非多行匹配 |
| 请求参数\*     | 包含 URL、Cookie 和 Body 中的参数                                              | 包含、不包含；等于、不等于；长度大于、小于；不存在；正则；多行、非多行匹配 |
| 自定义请求头\* | 客户端请求中除 Referer、User-Agent、Cookie 外的其他字段，也可以是自定义的字段  | 包含、不包含；等于、不等于；长度大于、小于；不存在；正则；多行、非多行匹配 |

带 \* 的匹配字段标识其为键值结构，这些字段的匹配内容可以接收一个 JSON 字符串以针对单个键的值、键名、值名或全部键、值名进行匹配。**若输入普通字符串或不符合 JSON 格式的字符串，则默认对全部键名、值进行匹配**。若键值结构匹配字段对应的操作符为长度大于/小于，在没有指定**特定键的值**的情况下则比较的是键/值总个数。

| 匹配内容类型 | 示例用法                                            | 说明                                                                                                                                                                                                              |
| ------------ | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 特定键的值   | `{"pattern": "string", "specific": "specific-key"}` | 匹配键值结构中的某一特定键 `specific-key` 的值。例如：对于 自定义请求头，则检测请求中的 `specific-key` 字段的值是否匹配 `string` ；对于 URL 查询参数，若其为 `?specific-key=xxx` ，则检测 `xxx` 是否匹配 `string` |
| 全部键名     | `{"pattern": "string", "keys": true}`               | 遍历匹配键值结构的全部键名。例如：URL 查询参数为 `?a=1&b=2` ，会分别检测键 `a` 和 `b` 是否匹配 `string`，任意一个键匹配就触发规则                                                                                 |
| 全部值       | `{"pattern": "string", "values": true}`             | 遍历匹配键值结构的全部值。例如：URL 查询参数为 `?a=1&b=2` ，会分别检测值 `1` 和 `2` 是否匹配 `string`，任意一个值匹配就触发规则                                                                                   |
| 全部键名、值 | `{"pattern": "string", "all": true}`                | 遍历匹配键值结构的全部值名和值。例如：URL 查询参数，若其为 `?a=1&b=2` ，会分别检测键值 `a`, `b`, `1` 和 `2` 是否匹配 `string`，任意一个键/值匹配就触发规则                                                        |
| 全部键名、值 | `string`                                            | 会被当成 `{"pattern": "string", "all": true}` 解析                                                                                                                                                                |

### 参数解码说明

可对匹配内容进行解码，支持多选，包含：

- URL 解码
- HTML 解码
- BASE64 解码
- 去除注释  
  去除匹配内容中的 `/*` 和 `*/` 以及它们之间的字符
- 空格压缩  
  将多个空白字符（包括空格）压缩成单个空格字符

来源 IP 不能进行参数解码，若选择了则会被忽略。

## 规则示例

1. 若业务域名 `example.com` 域名有 2 条 UWAF 规则：

- 规则 1：请求路径 包含 `.php` ，则拦截
- 规则 2：来源 IP 包含 `192.168.1.1` ，则放行
  规则 1 的优先级高于规则 2（顺序排列）。

情形(1)：当客户端的 IP 地址为 192.168.1.1 时，若其发送一条 URL 为 `http://example.com/123.php` 的请求，则会触发规则 1 的而被拦截。  
 情形(2)：当客户端的 IP 地址为 192.168.1.1 时，若其发送一条 URL 为 `http://example.com/?i=<script>alert(/1/)</script>` 的请求，则会触发规则 2 而被放行。

2. 若业务域名 `example.com` 有一后台管理登录入口 `/admin.php`，需要使用 UWAF 配置源 IP 地址访问限制，且同时不能完全放开对这些源 IP 地址的规则检测。
   规则示例：

   - 规则名称：后台界面访问限制
   - 匹配动作：拦截
   - 风险等级：高风险
   - 风险类型：越权访问
   - 匹配条件：
     - 来源 IP 不属于 `12.34.5.0/24` （允许访问的 IP 或 IP 网段）
     - 请求路径 包含 `/admin.php` （后台管理入口）

   情形(1)：当客户端的 IP 地址为 12.34.5.6 时，访问 `http://example.com/admin.php` 则不会触发这条规则，但会进行其他后续规则的检测。  
    情形(2)：当客户端的 IP 地址为 65.43.2.1 时，访问 `http://example.com/admin.php` 则会触发这条规则而被拦截。

3. 若某业务域名所采用的技术栈的某个组件爆出了漏洞，只要请求的 Cookie 中 `jam` 名称的值的长度大于 9 即可利用该漏洞（例如 `jam=0123456789`，值的长度为 10），在相关补丁没有发布前，需要使用 UWAF 防护此漏洞。
   规则示例：

   - 规则名称：防护 cookie-jam 漏洞
   - 匹配动作：拦截
   - 风险等级：高风险
   - 风险类型：漏洞攻击
   - 匹配条件：请求 Cookies 长度大于 `{"specific": "jam", "pattern": "9"}`

   情形(1)：当某正常客户端发送的请求的 Cookie 字段的值为 `username=Alice;jam=true` 时则不会触发这条规则，但会进行其他后续规则的检测。  
    情形(2)：当某恶意客户端发送的请求的 Cookie 字段的值为 `username=Mallory;jam=overflowattack` 时则会触发这条规则而被拦截。
