mod_security 2.x如何匹配未定义变量实现同IP请求顺序校验?
ModSecurity 2.x 未定义集合变量的匹配方案
你可以通过&前缀检测集合变量是否存在,该前缀返回值为0表示变量未定义/已过期,返回值为1表示变量有效存在。
完整实现配置
- 初始化IP级持久化集合(你原有配置是正确的)
SecAction id:'400000',phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR}
- 配置A类请求的标记规则,命中时设置5分钟有效期的访问标记
# 请将下方<匹配A类请求的规则>替换为你实际的A类请求匹配逻辑 SecRule <匹配A类请求的规则> "id:'400001',phase:1,t:none,nolog,pass,setvar:ip.my_var_name=1,expirevar:ip.my_var_name=300"
- 配置B类请求的校验规则,变量不存在时直接拒绝
你测试时用POST作为B类请求匹配条件的话,配置如下:
SecRule REQUEST_METHOD "^POST$" "id:'400002',phase:1,t:none,nolog,deny,status:401,chain" SecRule &IP:MY_VAR_NAME "@eq 0"
原有配置失效的原因
直接引用未定义的ip:my_var_name时,ModSecurity会直接跳过该规则的匹配逻辑,不会执行后续的运算符判断,因此你尝试的@unconditionalMatch、@eq 0、!非运算符都不会生效,只有通过&前缀检测变量存在性的方式,才能触发未定义场景的匹配。
内容的提问来源于stack exchange,提问作者Erik Melkersson
相关产品推荐
相关产品推荐

