Java 反向代理后面的Csrfguard

Java 反向代理后面的Csrfguard,java,web-applications,csrf,reverse-proxy,Java,Web Applications,Csrf,Reverse Proxy,我已经成功地安装在我的webapp上,但是当在反向代理后面的prepod上进行测试时,情况变得很糟糕。 CSFFARGER的JavaScript ISValeDebug不将我的域视为一个有效的域:CSRFGARID JavaScript ServServE返回未经代理的域… 这是javascript代码: if(isValidDomain(document.domain, "myRealDomain")) { … } isValidDomain只是一个字符串比较方法,问题是:CsrfGuard

我已经成功地安装在我的webapp上,但是当在反向代理后面的prepod上进行测试时,情况变得很糟糕。 CSFFARGER的JavaScript ISValeDebug不将我的域视为一个有效的域:CSRFGARID JavaScript ServServE返回未经代理的域…

这是javascript代码:

if(isValidDomain(document.domain, "myRealDomain")) { … }
isValidDomain
只是一个字符串比较方法,问题是:CsrfGuard JavaScriptServlet返回“myRealDomain”,javascript代码“document.domain”返回“myProxiedDomain”:字符串比较失败


我不知道在那一点上该做什么,我会感激的方向!我相信有些人以前遇到过这个问题,反向代理似乎很常见。

您可以将代理配置为添加头
X-Forwarded-By
X-Forwarded-For
X-Forwarded-Proto

代理背后的服务器可以使用这些头来重建原始请求(在代理上执行)

这样,csrfguard servlet将使用正确的域来生成脚本

每个代理/应用服务器的配置当然不同,但以下是Nginx与Tomcat结合的一个示例:

代理配置示例(Nginx):

示例应用程序服务器(tomcat/):


我遇到了一个问题,在反向代理和负载平衡器后面运行csrfguard-3.1,并通过SSL卸载,导致JavaScriptServlet返回404。csrf日志指出

“引用域https://******与请求域http://*********不匹配”

我必须设定目标

org.owasp.csrfguard.JavascriptServlet.refererMatchDomain=false

我们在csrfguard上也遇到了类似的问题,发现我们的代理服务器返回了错误的“Referer”URL。除此之外,我们还使用SSL,这带来了其他问题。我们发现,一旦建立了连接,就用“domain.tld”而不是csrfguard所期望的“domain.tld:443”完成了连接

 Referer domain https://localhost/shop/pages/main.jsf
 does not match request domain: https://localhost:443/shop/JS/csrfguard.js
我们通过将其添加到apache httpd配置中修复了此问题:

Header edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5"
RequestHeader edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5"
由于所有请求都来自https,因此我们通过以下方法固定了URI中的端口存在。
我相信您的案例可以通过相同的方式修复,或者将“Referer”标题设置为某个预定义的名称。(但这可能是一个安全问题,因为所有请求都来自“适当的”域)

我不熟悉CsrfGuard,但您能扩展
JavaScriptServlet
并为
myRealDomain
提供一个可配置的值吗?这是解决方案之一,但JavaScriptServlet是最终解决方案,我需要制作我自己的lib版本来实现这一点……可能需要重写isValidDomain方法以实现反向代理感知。似乎是框架的一个限制,祝你好运。在我的情况下,我需要额外的
httpServerPort
TrustedProxy
来让我的Tomcat应用程序代理意识到。这个解决方案对我来说也很有效——我在Azure Linux WebApps上使用CloudFlare实现CSRFGuard时遇到了同样的问题。
 Referer domain https://localhost/shop/pages/main.jsf
 does not match request domain: https://localhost:443/shop/JS/csrfguard.js
Header edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5"
RequestHeader edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5"