我已经在我的webapp上成功安装了CsrfGuard但是在反向代理后面的preprod上测试时情况变坏了。 CsrfGuard的javascript isValidDomain不认为我的域名是有效的:CsrfGuard JavaScriptServlet返回未经过代理的域名...
这是javascript代码:
if(isValidDomain(document.domain, "myRealDomain")) { … }
isValidDomain
只是一个字符串比较方法,事情是:CsrfGuard JavaScriptServlet返回" myRealDomain"和javascript代码" document.domain"返回" myProxiedDomain" :字符串比较失败!
我不知道该做什么,我会很感激方向!我相信有些人以前遇到过这个问题,反向代理看起来很常见。
答案 0 :(得分:3)
您可以配置代理以添加标题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"
/>
答案 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
让它发挥作用。