当客户访问我个人服务器上托管的PHP站点时,他在URL中包含一个变量(例如https://www.example.com/test.php?t=somevalue
),modsecurity在error.log
文件中显示错误消息。
规格:
Server OS: Linux server 3.2.0-4-486 #1 Debian 3.2.57-3 i686
Apache: version 2.2.22
PHP: version 5.4.4-14+deb7u9
Modsecurity: version 2.8.0
错误讯息:
ModSecurity: Warning. Match of "eq 1" against "&ARGS:CSRF_TOKEN" required. [file "/usr/share/modsecurity-crs/optional_rules/modsecurity_crs_43_csrf_protection.conf"] [line "31"] [id "981143"] [msg "CSRF Attack Detected - Missing CSRF Token."]
This所以问题类似于我的问题,除非我在客户端的浏览器添加变量时才会收到错误。
使用OWASP base_rules
和optional_rules
配置Modsecurity。我没有使用符号链接。
我的服务器配置中唯一不寻常的是它使用自签名SSL证书,但我不相信这与此问题有任何关系。
无论PHP文件包含什么,都会显示错误,HTML文件也不会出现错误。
导致此错误的原因是什么,如何消除它?
如果缺少CSRF令牌,我该如何添加?
答案 0 :(得分:0)
很抱歉要说清楚:
导致此错误的原因是什么,如何消除它?
错误是由上述规则引起的。您可以通过提供CSRF令牌或禁用该规则来消除它。
答案 1 :(得分:0)
由于您提到这是您的个人服务器,我猜它不会托管业务关键型应用程序。因此,我认为您并不担心跨站点请求伪造。
如果这是真的,你可以简单地不包括(拉入)配置文件" modsecurity_crs_43_csrf_protection.conf"在您的Apache配置文件中。
答案 2 :(得分:0)
规则(modsecurity_crs_43_csrf_protection.conf中的id 981143)是一个链式规则。首先,它检查请求是否有任何 ARG UMENTS(获取URL中的t参数),然后检查请求CSRF值是否匹配。
由于我的应用程序的敏感数据总是在POST中传递,我已经更改了规则,因此它只考虑POST请求
在上面的文件更改中:
SecRule& ARGS“@ge 1”“chain,phase:2,id:'981143'
为:
SecRule& ARGS_POST“@ge 1”“chain,phase:2,id:'981143'
或重新创建自定义规则,以避免丢失这些更新更改。