[英]Csrfguard behind a reverse proxy
我已經在我的webapp上成功安裝了CsrfGuard ,但是當在反向代理后面的preprod上測試時,事情變得糟糕了。 CsrfGuard的javascript isValidDomain不認為我的域是有效的:CsrfGuard JavaScriptServlet返回未經過代理的域...
這是javascript代碼:
if(isValidDomain(document.domain, "myRealDomain")) { … }
isValidDomain
只是一個字符串比較方法,事情是:CsrfGuard JavaScriptServlet返回“myRealDomain”,javascript代碼“document.domain”返回“myProxiedDomain”:字符串比較失敗!
我不知道該做什么,我會很感激方向! 我相信有些人以前遇到過這個問題,反向代理似乎很常見。
您可以配置代理以添加標頭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"
/>
我們遇到與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”標題設置為某個預定義的名稱來修復。 (但這可能是一個安全問題,因為所有請求都來自'正確'域名)
我有一個問題,在反向代理后面運行csrfguard-3.1和帶有SSL卸載的負載均衡器導致JavaScriptServlet返回404. csrf日志聲明
“Referer domain https:// *****與請求域http:// ****** ”不匹配
我不得不設置
org.owasp.csrfguard.JavascriptServlet.refererMatchDomain=false
讓它工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.