使用$ _GET时的Modsecurity CSRF警报

时间:2014-06-06 15:20:04

标签: php apache csrf mod-security

当客户访问我个人服务器上托管的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_rulesoptional_rules配置Modsecurity。我没有使用符号链接。

我的服务器配置中唯一不寻常的是它使用自签名SSL证书,但我不相信这与此问题有任何关系。

无论PHP文件包含什么,都会显示错误,HTML文件也不会出现错误。

导致此错误的原因是什么,如何消除它?

如果缺少CSRF令牌,我该如何添加?

3 个答案:

答案 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'

或重新创建自定义规则,以避免丢失这些更新更改。