我们使用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_TOKEN
和OWASP_CSRFTOKEN
)。
解决scheme是要么:
nginx:允许标题中的下划线
server { ... underscores_in_headers on;
jasperserver-pro/WEB-INF/esapi/Owasp.CsrfGuard.properties
令牌configuration名称 另见这里:
自己回答 – 希望这对其他人也有用处
我有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