我已将以下任一项添加到我的规则中:
SecRule REQUEST_URI "@beginsWith /directory" "phase:1,id:12345,allow"
SecRule REQUEST_URI "@beginsWith /directory" "phase:1,id:12345,ctl:ruleEngine=off"
当我浏览 /directory/javascript.php?sqlinjection 时,它将允许显示 /directory 中的 HTML,但不会显示分别位于根目录 /css/ 和 /images/ 中的 CSS 和图像。它们似乎被阻止了,因为页面上存在 SQL 注入,但这些目录没有排除。
我如何配置它以完全关闭 /directory 内的 mod_security 并显示所有图像和 CSS?
答案1
在 ModSecurity 中,每个请求都被视为一个独立的请求,它不知道您正在为以前的请求加载 CSS 和图像。
它唯一可能知道这一点的方法是查看 Referer HTTP 标头中的内容。事实上,我怀疑这就是导致您出现问题的原因,因为引用页面的 URL 包含看起来像 SQL 注入的内容,因此它加载的每个资源也会被阻止。
因此您有多种选择:
您可以为 /css 和 /images 编写类似的规则。请注意,您的两条规则都执行相同的操作,并且两者都不是必需的 - 选择其中一个。此外,每条规则都需要有一个独立的 ID,但您在两条规则中重复了 12345。
您可以关闭所有请求的 ModSecurity。它似乎给您带来了更多问题,但它正在解决。显然,这意味着您会失去它提供的安全保护,但如果您最终打算允许几乎每个请求都关闭它,那么这是一个选择。
您可以编写一条新规则来根据该引荐来源绕过 ModSecurity:
#Allow any requests for resources loaded by pages in /directory SecRule REQUEST_HEADERS:Referer "@beginsWith https://www.example.com/directory" "phase:1,id:12347,allow"
您可以覆盖该字段受影响的规则(我假设规则 942100 是本例中触发的规则):
#Exclude Referer HTTP Header from being checked by rule id 949110 SecRuleUpdateTargetById 942100 !REQUEST_HEADERS:Referer
选项 4) 是推荐的方法,这样您只会禁用针对该特定字段给出误报的规则。请注意,可能会触发多个规则,因此您可能需要多个例外。您还在上一个问题规则 949110 正在触发,但这是最终的检查规则,因此您需要了解在此之前触发的规则,并导致 949110 开始执行,并按照上述方法将其过滤掉。
这也是您真正应该防止原始 PHP 脚本被阻止的方法,而不是全面关闭整个 /directory 位置的 ModSecurity。
老实说,这些都是配置 ModSecurity 时需要做的相当标准的事情,所以建议你多读一些相关内容。ModSecurity 手册在我看来这是学习这个的最佳方式。