反向代理背后的 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-By
、X-Forwarded-For
和X-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"
/>
【讨论】:
在我的情况下,我需要额外的httpServerPort
和 trustedProxies
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的主要内容,如果未能解决你的问题,请参考以下文章
Nginx 反向代理背后的 Grafana 返回 alert.title