Apache 匹配多个事物的复杂规则

Apache 匹配多个事物的复杂规则,apache,mod-security2,Apache,Mod Security2,我是使用mod_security2的新手。我只用了大约三个星期 希望有人能告诉我如何做到以下几点。 我正在寻找一种创建规则的方法: 如果是url,则在域名以/SOMETHING 参数名称(包含任何位置的日期或时间戳)或(确切地说是lastLogon) 并且参数值匹配正则表达式^[0-9]{4}-[0-9]{2}-[0-9]{2}[0-9]{2}:[0-9]{2}-[0-9]{3}[-+]?[0-9]{4}$ 或者参数名正好是“filters”(不管它有什么值) 然后执行ctl:ruleRemov

我是使用mod_security2的新手。我只用了大约三个星期

希望有人能告诉我如何做到以下几点。 我正在寻找一种创建规则的方法:

  • 如果是url,则在域名以
    /SOMETHING
  • 参数名称(包含任何位置的
    日期
    时间戳
    )或(确切地说是
    lastLogon
  • 并且参数值匹配正则表达式
    ^[0-9]{4}-[0-9]{2}-[0-9]{2}[0-9]{2}:[0-9]{2}-[0-9]{3}[-+]?[0-9]{4}$
  • 或者参数名正好是“filters”(不管它有什么值)
  • 然后执行ctl:ruleRemoveTargetById=981173
  • 我认为缺少的是一个解释复杂的SecRule示例。也许我就是找不到,在这种情况下,请原谅我,请给我指出正确的方向

    我使用的是2.9.0版

    也许是用什么的?。无法使其工作(因为需要布尔值
    )。我不知道

    既然我已经在写这个求助请求,也许有一个捷径可以让我知道:如果域名后面的url以
    /SOMETHING
    开头,我有很多规则要写,有没有简单的方法来处理它们


    提前谢谢。

    我想我知道怎么做了

        SecRule REQUEST_FILENAME "@beginsWith /SOMETHING" "phase:1,t:none,nolog,pass,ctl:ruleRemoveTargetById=981173;ARGS:filters,id:'10000'"
        SecRule REQUEST_FILENAME "@beginsWith /SOMETHING" "phase:1,chain,t:none,nolog,pass,ctl:ruleRemoveById=981173,id:'10010'"
            SecRule ARGS:/(?i)^.*date.*$/|ARGS:/(?i)^.*timestamp.*$/|ARGS:lastLogon "@rx ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}[-+]?[0-9]{4}$" "t:none"
    
    我说得对吗?
    有什么意见吗?

    觉得很难准确理解你想要什么

    也许可以为所有这些编写一条链式规则,但编写多条规则可能更容易、更可读

    我建议您查看哪些包含请求的资源和参数

    SecRule REQUEST_URI "^/SOMETHING.*\?(.*&)+(.*date.*|.*timestamp.*|lastLogon)=[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}[-+]?[0-9]{4}(&.*)+$" "id=12345,ctl:ruleRemoveTargetById=981173"
    
    另外一条规则是:

    SecRule REQUEST_URI "^/SOMETHING.*\?(.*&)+(filters)=.*" "id=12346,ctl:ruleRemoveTargetById=981173"
    
    最后一条规则也可以写成:

    SecRule REQUEST_FILENAME "^/SOMETHING.*" "id=12346,chain"
        ARGS "^filters$" "ctl:ruleRemoveTargetById=981173"
    
    至于您的另一个需求,您可以在请求文件名与某个内容匹配时设置一个变量,然后每次都进行检查。但每次通过上面最后一段代码片段的链式规则进行检查可能也同样容易。

    工作规则如下:

    SecRule REQUEST_FILENAME "@beginsWith /SOMETHING" \
            "phase:1,t:none,nolog,pass,ctl:ruleRemoveTargetById=981173;ARGS:filters,id:'10000'"
    
    SecRule ARGS:/(?i)^.*date.*$/|ARGS:/(?i)^.*timestamp.*$/|ARGS:/(?i)^lastLogin$/ \
            "@rx ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}[-+]?[0-9]{4}$" \
            "phase:2,chain,t:none,nolog,pass,id:'10010'"
        SecRule REQUEST_FILENAME "@beginsWith /SOMETING" "ctl:ruleRemoveById=981173"
    
    我现在面临的问题是,第2阶段没有在我的
    modsecurity\u crs\u 15\u customrules.conf
    配置文件中执行,它只有在
    modsecurity.conf
    中才会执行


    我仍然在寻找这个新问题的最终解决方案。(请参阅:)

    这将不起作用。一次只能检查一件事,第一条规则检查操作部分中不正确的ARGS(因此需要链式规则)。虽然第二条规则可能会起作用,但在传递链的第二部分之前,您不应该执行ctl操作-否则这将在链的第一部分匹配后调用。我想我必须进一步测试它,因为它开始时没有错误,并且在添加这些规则后停止显示403个错误。感谢您指出这一点。您可以发现:“只有当所有变量检查返回正点击时,才会触发链式规则第一部分中指定的破坏性操作”,因此我认为链式规则应该没有问题。(我希望)根据下面的评论,ctl是一个无破坏性的:哇,我想您是对的。。。所以在第一个规则之后的哪个规则中我应该放置ctl规则?这有关系吗?我不太喜欢你写的第一段代码。它不能保证单词
    date
    timestamp
    lastLogon
    对应于参数。这些子字符串可能在其他上下文中匹配。。。我以前也尝试过类似的方法,但没有成功,因为在第一行之后不允许使用
    ctl
    规则。是的,尽管问号确保它们是参数或参数值,但对参数来说这是一个公平的观点。你会更了解你的应用程序,知道这是否足够,但要理解你的顾虑。您可以添加更多的链来测试它们是否是参数。Ctl规则在第一行AFAIK之后是允许的,因为它们被归类为无中断的:我想我发现了问题。我补充说