反向代理背后的Csrfguard

use*_*684 7 java reverse-proxy web-applications csrf

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

这是javascript代码:

if(isValidDomain(document.domain, "myRealDomain")) { … }
Run Code Online (Sandbox Code Playgroud)

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

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

R. *_*olt 6

您可以配置您的代理以添加标头X-Forwarded-By,X-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;
Run Code Online (Sandbox Code Playgroud)

示例应用程序服务器(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"
   />
Run Code Online (Sandbox Code Playgroud)