在nginx后面运行jasperserver:潜在的CSRF攻击

我们使用nginx进行httpsstream量卸载,代理到在端口8080上运行的本地安装的jasperserver(5.2)。

internet ---(https/443)---> nginx ---(http/8080)---> tomcat/jasperserver 

直接在其端口上访问jasperserver时,一切都很好。 当通过nginx访问服务时,一些function被破坏(例如,在jasperserver UI中编辑用户),jasperserver日志具有这样的条目:

 CSRFGuard: potential cross-site request forgery (CSRF) attack thwarted (user:%user%, ip:%remote_ip%, uri:%request_uri%, error:%exception_message%) 

经过一些debugging,我们发现这个原因:

在它的标准configuration中,nginx不会转发包含下划线名称的请求头。 Jasperserver(和OWASP框架)默认使用下划线来传输csrf标记(分别为JASPER_CSRF_TOKENOWASP_CSRFTOKEN )。

解决scheme是要么:

  • nginx:允许标题中的下划线

     server { ... underscores_in_headers on; 
  • jasperserver:更改jasperserver-pro/WEB-INF/esapi/Owasp.CsrfGuard.properties令牌configuration名称

另见这里:

  • 标题variables在生产中丢失
  • http://wiki.nginx.org/HttpCoreModule#underscores_in_headers

自己回答 – 希望这对其他人也有用处

我有Jasperserver 5.5 AWS AMI的这个问题

更具体:

 /var/lib/tomcat7/webapps/jasperserver-pro/WEB-INF/esapi/Owasp.CsrfGuard.properties 

更改:

 org.owasp.csrfguard.TokenName=JASPER_CSRF_TOKEN org.owasp.csrfguard.SessionKey=JASPER_CSRF_SESSION_KEY 

至:

 org.owasp.csrfguard.TokenName=JASPERCSRFTOKEN org.owasp.csrfguard.SessionKey=JASPERCSRFSESSIONKEY