合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 说明 匹配方式(匹配符)这个是规则配置的基础,需要深入的理解,并融会贯通才可以配置出自己想要的规则 **对应匹配规则中第二个参数** ## 匹配符 这里就通过一些例子来让大家对匹配符有更清楚的理解,这里关键的前提是 **能不用正则就不用!!!** ![](https://img.kancloud.cn/42/04/4204384a056b379072b5af66747650f0_1130x642.png) ### 等于 等于匹配是进行字符串的完全匹配,是区分大小写的。 比如匹配域名时,匹配符选择等于,如果我要匹配`www.abc.com`那边就可以在内容处填写该内容 第一个参数就是配置的域名,第二个参数为空/或者 `=`,第三参数表示是否取反(可以省略不写) ![](https://img.kancloud.cn/67/51/67518c346a4f7ed9df578b135dd4274a_751x539.png) ### 数组 等于匹配时只有一个不够用,当匹配多个相等的内容时,就可以使用数组(满足数组中任何一个即为真) 当我们需要进行对接口进行白名单控制,不是我们允许的`uri` 就可以全部拒绝访问,配合取反功能即可 ``` 域名 api.nginx.com 对外有4个 接口 uri /api/get/some-msg /api/add/some-msg /api/set/some-msg /api/del/some-msg ``` 例子:在普通规则 --- uri 页中可以这样配置 ![](https://img.kancloud.cn/cd/27/cd278bd78d32a93fbd7366e7c47f6455_756x400.png) ### 字典 数组匹配时条目太多(超过500个)使用,和数组效果一样,不过其空间复杂度为 1 ,效率更高,其有2个参数一个是匹配的内容,一个是布尔类型,真:表示匹配,假:表示不匹配 例子:实现和上面一样的作用,使用字典来配置 ![](https://img.kancloud.cn/c4/54/c454ce0392ddb2e77f81ae9a24042f6f_753x465.png) ### 开头列表/开头扩展列表 开头列表:名字标记有些俗气,但是非常好理解,就是匹配字符串开头,且是一个数组(数组中任意一个匹配成功,即匹配命中) 开头扩展列表:仅仅是不区分大小写的开头列表 ``` 当匹配一些 uri 时,我们只知道他们是以什么什么开头的(区分大小写),后面的 uri 是一些可变参数 /api/v1/sms/{tel}/status /api/v2/aisp/{user-id}/msg 等等这样的 uri 时 ``` 例子:实现上面类似的功能 ![](https://img.kancloud.cn/06/ce/06ce86960dbb20153ad4c16c242daf83_744x460.png) ### 结尾列表/结尾扩展列表 结尾列表,同样俗气的标记,就是匹配字符串的结尾,是个数组(数组中任意一个匹配成功,即匹配命中) 结尾扩展列表:仅仅是不区分大小写的结尾列表 ``` 当一些域名 他们是 前缀不一样,但是后面的字符串是完全一样的,就可以使用该匹配符进行匹配 www1.nginx.com img.nginx.com static.nginx.com 05c12a287334386c94131ab8aa00d08a.cdn.nginx.com 7d6006e64eb59bcf40d8f8f31ff94ea9.ds.nginx.com 在包含时出现的域名,同样也可以使用结尾列表匹配,且性能会高于 包含 ``` 举例子: ![](https://img.kancloud.cn/55/53/555377d28e970b8fb123d969a491d263_733x434.png) ### 包含 比如一些情况下,等于不能进行很好的匹配,但是我们需要匹配的`host`都包含一些关键字,就可以使用 包含 ``` www1.nginx.com img.nginx.com static.nginx.com 05c12a287334386c94131ab8aa00d08a.cdn.nginx.com 7d6006e64eb59bcf40d8f8f31ff94ea9.ds.nginx.com ... 比如我们需要匹配这些域名,这些都包含了`nginx.com`,那么就可以使用包含来匹配这些域名 ``` 举例子: 第二参数改成 in,第一个参数需要是字符串 ### 多模匹配 (aho) 效果同包含列表,但是其性能是远远高于的,具体是使用了 aho 的算法,当匹配的字符串不是很多,很大时,可以不用该匹配方式 ### 包含列表 / 包含扩展列表 包含列表:包含的复数形式,当有多个字符串需要进行包含匹配时,是个数组(数组中任意一个匹配成功,即匹配命中) 包含扩展列表:仅仅是不区分大小写的包含列表 一些扫描器,攻击软件在`useragent`处有一些特征,就可以使用包含/包含扩展列表进行匹配 ![](https://img.kancloud.cn/1b/12/1b12fc190dd5fdc02ec4dde1cdcd3025_747x430.png) ### 正则 正则是匹配中使用比较多的地方, 但是正则写的不好,会对性能有非常大的影响,所以在前面就特别说明了,**能不用正则的就不用**。 正则匹配这里用到了 `luajit` 缓存 等一些优化特性,即便是这样,正则的使用一定要仔细,看几个例子吧 ![](https://img.kancloud.cn/77/29/772958784f8fe5570ed233fd1291986a_742x342.png) 使用正则一定要进行匹配测试!!! 注:lujit 中特殊的优化特性(启用JIT、缓存),看一下使用正则时的参数的说明 ![](https://img.kancloud.cn/81/ff/81ff42dc572dc5ae723894b846837b4f_854x458.png) ### 长度 长度比较好理解就是对字符串的长度进行匹配 ``` 一些 GET 请求参数 我们可以进行长度的控制,比如 userid ,其长度是 我们开发人员约定生成的(18位数字) 那么就可以使用一定规则进行匹配,不符合就可以拦截 ``` 例子:限制了所有query_string参数的值长度只能是10-20,不在这个范围就都被拦截 ![](https://img.kancloud.cn/68/f8/68f8cbd1095dbaf2b683492e5bbfc56b_735x347.png) ### ip段 这里是ip段的匹配,用于匹配整个网段的ip ``` 192.168.0.1/24 就可以匹配 ip 192.168.0.1 - 255 ``` 第二个参数为:cidr,第三个参数就是 tabel了 ### token token是特殊的匹配,token的匹配是WAF在内存中生成的一个随机字符串,匹配则是判断该字符串是否由WAF生成的,这样应用场景一般是一些防护CC攻击时使用 ![](https://img.kancloud.cn/3b/ca/3bca84a2480daab6802bf4b2dc5428a6_753x525.png) ``` 该条规则就是 访问 uri = /api/debug 时,我们进行 GET 参数(cctoken) 进行匹配,匹配失败则返回一个固定的文件内容 <html> <head> <script> var Num="@token@"; var url = window.location.href; var re = new RegExp("\\?","i"); var url = window.location.href; if(re.test(url)){ window.location.href=url+"&cctoken="+Num; } else { window.location.href=url+"?&cctoken="+Num; } </script> </head> </html> 这是一个JS跳转,跳转的时候添加了一个 cctoken 的参数,其值为 @token@ 注:WAF在返回 文件/字符串 时,会将 @token@ 替换为一个WAF 生成的随机字符串 这样配合 对参数 cctoken 进行 token 的检查,这样就可以实现一种 cc 防护了 ```