我们使用nginx进行https流量卸载,代理到在端口8080上运行的本地安装的jasperserver(5.2).
internet ---(https/443)---> nginx ---(http/8080)---> tomcat/jasperserver
Run Code Online (Sandbox Code Playgroud)
当直接在其端口上访问jasperserver时,一切都很好.当通过nginx访问服务时,某些功能被破坏(例如,在jasperserver UI中编辑用户),jasperserver日志具有如下条目:
CSRFGuard: potential cross-site request forgery (CSRF) attack thwarted (user:%user%, ip:%remote_ip%, uri:%request_uri%, error:%exception_message%)
Run Code Online (Sandbox Code Playgroud)
经过一些调试后,我们找到了原因:
在其标准配置中,nginx不转发其名称中包含下划线的请求标头.然而,Jasperserver(和OWASP框架)默认使用下划线来传输csrf令牌(JASPER_CSRF_TOKEN
和OWASP_CSRFTOKEN
分别).
解决方案是:
nginx:允许标题中的下划线
server {
...
underscores_in_headers on;
Run Code Online (Sandbox Code Playgroud)jasperserver-pro/WEB-INF/esapi/Owasp.CsrfGuard.properties
另见: