我们正在使用 nginx 进行 https 流量卸载,代理到在端口 8080 上运行的本地安装的 jasperserver (5.2)。
internet ---(https/443)---> nginx ---(http/8080)---> tomcat/jasperserver
当直接在其端口上访问 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%)
经过一番调试,我们发现了这个问题的原因:
在其标准配置中,nginx 不会转发名称中包含下划线的请求标头。Jasperserver(和 OWASP 框架)默认使用下划线来传输 csrf 令牌(JASPER_CSRF_TOKEN
和OWASP_CSRFTOKEN
分别)。
解决方案是:
nginx:允许标题中的下划线
server { ... underscores_in_headers on;
- jasperserver:更改令牌配置名称
jasperserver-pro/WEB-INF/esapi/Owasp.CsrfGuard.properties
另见此处: