反向代理背后的 Csrfguard

Posted

技术标签:

【中文标题】反向代理背后的 Csrfguard【英文标题】:Csrfguard behind a reverse proxy 【发布时间】:2014-04-24 08:55:33 【问题描述】:

我已经在我的 web 应用程序上成功安装了 CsrfGuard,但是在反向代理后面的 preprod 上进行测试时,事情变得很糟糕。 CsrfGuard 的 javascript isValidDomain 不认为我的域是有效的:CsrfGuard JavaScriptServlet 返回未代理的域...

这是javascript代码:

if(isValidDomain(document.domain, "myRealDomain"))  … 

isValidDomain只是一个字符串比较方法,事情是:CsrfGuard JavaScriptServlet返回“myRealDomain”,javascript代码“document.domain”返回“myProxiedDomain”:字符串比较失败!

那时我不知道该怎么做,我希望得到指导!我相信有些人之前遇到过这个问题,反向代理似乎很常见。

【问题讨论】:

我对 CsrfGuard 不熟悉,但是你能扩展JavaScriptServlet 并为myRealDomain 提供一个可配置的值吗? 嗯,这是解决方案之一,但是 JavaScriptServlet 是最终版本,我需要制作自己的 lib 版本才能做到这一点...... 可能需要重写 isValidDomain 方法才能知道反向代理。似乎是框架的限制,祝你好运。 【参考方案1】:

您可以配置您的代理以添加标头X-Forwarded-ByX-Forwarded-ForX-Forwarded-Proto

代理后面的服务器可以使用这些标头来重建原始请求(如在代理上执行的那样)。

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

每个代理/应用程序服务器的配置当然不同,但这里是 nginx 与 Tomcat 结合的示例:

示例代理配置(Nginx):

### proxy headers ###
proxy_set_header        X-Forwarded-By          $server_addr:$server_port;
proxy_set_header        X-Forwarded-For         $remote_addr;
proxy_set_header        X-Forwarded-Proto       $scheme;

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

<Valve
    className="org.apache.catalina.valves.RemoteIpValve"
    internalProxies="trusted-ip-here"
    remoteIpHeader="x-forwarded-for"
    proxiesHeader="x-forwarded-by"
    protocolHeader="x-forwarded-proto"
   />

【讨论】:

在我的情况下,我需要额外的 httpServerPorttrustedProxies params 才能让我的 Tomcat 应用代理知道。【参考方案2】:

我们在使用 csrfguard 时遇到了类似的问题,发现我们的代理服务器返回了错误的“Referer”网址。除此之外,我们还使用了 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”标头设置为某个预定义名称来解决。 (但这可能是一个安全问题,因为所有请求都来自“正确”域)

【讨论】:

【参考方案3】:

我遇到了一个问题,即在反向代理后面运行 csrfguard-3.1 并使用 SSL 卸载负载平衡器导致 JavaScriptServlet 返回 404。说明 csrf 日志

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

我必须设置

org.owasp.csrfguard.JavascriptServlet.refererMatchDomain=false

让它工作。

【讨论】:

这个解决方案也对我有用 - 我在使用 CloudFlare 在 Azure Linux WebApps 上实现 CSRFGuard 时遇到了同样的问题。

以上是关于反向代理背后的 Csrfguard的主要内容,如果未能解决你的问题,请参考以下文章

反向代理背后的密钥斗篷

公共反向代理背后的 WCF Webservice

Nginx 反向代理背后的 Grafana 返回 alert.title

Apache 反向代理背后的 Apache Zeppelin

反向代理背后的 SOP 问题

nginx反向代理背后的grafana