WAF规则
规则示例
只允许某些特定来源的网站访问
这里面就有两个规则:一个是我们允许所有来源为空的访问(也就是用户直接访问网站),第二个就是允许特定域名的来源访问,所以我们要添加的规则就是阻止以下条件的访问:
- 来源不为空
- 来源不是我们允许的域名
在规则集里添加的规则如下:
- 规则:
- 规则1
- 参数:
请求来源 - [refererOrigin]
- 操作符:
正则不匹配
- 对比值:
a\.com|b\.c\.d\.com
- 这里写的是你允许的域名列表
- 要符合基本的正则表达式语法
- 参数:
- 规则2
- 参数:
请求来源 - [refererOrigin]
- 操作符:
字符串不等于
- 对比值:不填留空
- 参数:
- 规则1
- 规则之间的关系:
和(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> 之类的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
所以就会和我们写的正则相匹配。