有人可以帮我解释一下感叹号在ModSecurity规则中的作用是什么
SecRuleUpdateTargetById 932100 "!ARGS:foo"
在阅读和制定规则时,人们如何阅读和解释"!ARGS:foo"
与"ARGS:foo"
?
当测试差异时,带有感叹号的规则通过在存在该参数时不应用该规则ID来提供所需的结果。
我已经在https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)#args_names处引用了文档,并试图从其他示例中收集到我可能得到的信息,但也许可以用不同的措词来分解它。
非常感谢您的帮助!
------编辑------
到目前为止,谢谢您的解释。
之前排除规则中写的“等效”规则为什么没有“感叹号”?
SecRule REQUEST_URI "@streq /my/endpoint" \
"id:0003, \
phase:2, \
pass, \
nolog, \
ctl:ruleRemoveTargetById=931130;ARGS:foo"
答案 0 :(得分:1)
表示“ Not”,在本示例中用于排除某些参数。
以下内容:
SecRuleUpdateTargetById 932100 "!ARGS:foo"
更改规则932100,以查看规则中指定的所有目标(参数foo
除外)。
之所以这样做是因为参数foo
通常会导致该规则错误触发。因此,您的选择是完全关闭此规则,或者从该规则中排除此参数。后者通常是更好的选择,因为这意味着该规则对于其他参数仍然适用,因此仍然证明了它的大部分保护作用。
在排除项[(ctl:ruleRemoveTargetById)]之前编写的“等效”规则为什么没有“感叹号”?
那是因为它们不是严格意义上的“等效”。 SecRuleUpdateTargetById
通过添加到规则来更新目标,而ctl:ruleRemoveTargetById
从目标中删除位。如果存在SecRuleRemoveTargetById
,则它们将更等效,但没有。实际上,ModSecurity Reference manual甚至解决了这个问题:
- ruleRemoveTargetById -由于此操作仅用于删除目标,因此用户无需使用char!在目标列表之前。
我不能说为什么他们决定实施ctl:ruleRemoveTargetById
而不是ctl:ruleUpdateTargetById
。