mod_security(2.x):如何匹配未定义的 mod-sec 变量?

mod_security(2.x): How to match on an undefined mod-sec variable?

注:问题已更新:

我真正想解决的是:

两种请求:A 和 B。

只有在过去 5 分钟内(从同一 ip 地址)呼叫了 A,才允许 B。

我的想法是通过一个 SecRule 来解决这个问题,为 A 请求设置一个 mod_sec-variable 超时超时,表示其他类型的请求可以。

对于 B 请求,我想检查是否设置了 mod_sec-variable。如果未设置,我想拒绝该请求。

我的问题是,当变量尚未设置或已过期时,我无法匹配第二个 SecRule。

原始问题更多的是描述我如何尝试进行第二场比赛

如何在 Apache 配置中对(尚未)未定义的变量进行 mod_security(2.x) SecRule 匹配?

即如果尚未定义变量,我需要执行 SecRule。我测试的一些东西与 @eq 0 匹配,因为其他任何东西都应该转换为 0 但那没有用。我也尝试使用!作为 SecRule 的运算符字段内的非运算符但没有用(或者可能使用不正确?)。甚至尝试使用 @unconditionalMatch 但它仍然不匹配。

SecAction id:'400000',phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR}
... in a <location ...> ...
  SecRule REQUEST_METHOD "^POST$" "id:'400002',t:none,nolog,deny,status:401,chain"                                                      
  SecRule ip:my_var_name "@unconditionalMatch"  
...

我测试了用 REQUEST_METHOD 等定义的值替换我的(尚未)未定义的变量。然后它匹配,所以只是变量的使用导致它失败。注意:我添加这个只是作为我的测试示例:

SecAction id:'400000',phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR}
... in a <location ...> ...
  SecRule REQUEST_METHOD "^POST$" "id:'400002',t:none,nolog,deny,status:401,chain"                                                      
  SecRule REQUEST_METHOD "@unconditionalMatch"  
...

所以似乎只是使用了一个(尚未)未定义的变量,它无法实现。

我正在搜索 https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-%28v2.x%29 检查未定义变量的方法,但找不到任何有用的方法。

不幸的是,上面提到的文档没有描述 & 在 SecRule 变量的情况下的“运算符”。这个字符有特殊含义:

  • 如果变量是一个集合(例如ARGS),那么使用&返回集合的长度。例如。 &ARGS 告诉你有多少参数
  • 如果变量是一个字符串(例如REQUEST_URI),那么它给出它的值的长度。您可以将它用于集合成员,例如。 &REQUEST_HEADERS:Host

您可以将此形式用于带有数字参数的运算符 @eq,例如。 @eq 0.

因此,根据您的说明,我认为您可以使用如下方式:

SecRule REQUEST_METHOD "^POST$" \
    "id:400002,\
    t:none,\
    nolog,\
    deny,\
    status:401,\
    chain"                                                      
    SecRule &IP:my_var_name "@eq 0"

Here 你可以找到一些例子。

请注意,提到的 @unconditionalMatch 什么都不做,它 returns 始终为真 - 它等同于您使用 SecAction 而不是 SecRule。请参阅 documentation