https トラフィックのオフロードに nginx を使用し、ポート 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
こちらもご覧ください: