反向代理背后的Csrfguard

时间:2014-03-18 15:10:08

标签: java web-applications csrf reverse-proxy

我已经在我的webapp上成功安装了CsrfGuard但是在反向代理后面的preprod上测试时情况变坏了。 CsrfGuard的javascript isValidDomain不认为我的域名是有效的:CsrfGuard JavaScriptServlet返回未经过代理的域名...

这是javascript代码:

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

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

我不知道该做什么,我会很感激方向!我相信有些人以前遇到过这个问题,反向代理看起来很常见。

3 个答案:

答案 0 :(得分:3)

您可以配置代理以添加标题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"
   />

答案 1 :(得分:2)

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

 Referer domain https://localhost/shop/pages/main.jsf
 does not match request domain: https://localhost:443/shop/JS/csrfguard.js

我们通过将此添加到apache httpd config:

来解决此问题
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”标题设置为某个预定义的名称来修复。 (但这可能是一个安全问题,因为所有请求都来自'正确'域名)

答案 2 :(得分:0)

我遇到一个问题,在反向代理后面运行csrfguard-3.1并且SSL卸载的负载均衡器导致JavaScriptServlet返回404. csrf日志声明

“Referer domain https:// ***** 与请求域http:// ******

不匹配

我必须设置

org.owasp.csrfguard.JavascriptServlet.refererMatchDomain=false

让它发挥作用。