繁体   English   中英

配置多个分支时,request.getHeader(“ host”)返回什么

[英]what does request.getHeader(“host”) return when multiple legs are configured

为了在Restful服务中实现CSRF安全性,我遵循了OWASP中的文档

OWASP建议采用以下方法来处理CSRF攻击(参考URL: https : //www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet

我们需要执行两个步骤:1.检查标准标头,以验证请求是否来自同一来源。2.检查CSRF令牌

1.检查标准标头,以验证请求是否来自同一来源:建议对照引荐来源对主机进行检查。 由于在请求中更改引荐来源网址和主机标头并不容易,因此我们可以做的第一步是检查引荐来源是否包含主机。

2.检查CSRF令牌

检查同步令牌是实现它的一种方法。 但这适用于有状态的应用程序。 由于我们的应用程序是无状态的,因此OWASP建议传递一个自定义标头,并检查它是否存在于服务器端,我实现了相同的目标。

我试图写下面的代码来检查第一点

 String host = "/"+request.getHeader("host")+"/";
 String referer = request.getHeader("referer");

if(referer!=null && !referer.contains(host)){
            LOGGER.info("referer doesnot contain host");
            accessDeniedHandler.handle(request, response, new AccessDeniedException(
                    "Missing or non-matching CSRF-token"));
            return;
        }

这在我的本地和测试环境中正常工作,那里只有一只脚。 但是,当我在具有两个分支的stage env中对其进行测试时,引荐来源网址和主机名不同。

主机名的机器名称如下

machin002:8080

但我希望域名像

sample.domain.com

我需要为此主机配置域名吗?

首先,您的推荐人检查不力。

假设主机标头是www.example.com以提出合法请求。

如果攻击者从他们自己的域evil.example.org向您发送跨域请求,则可以通过从以下URL发送请求来通过您的检查: https://evil.example.org/?www.example.com : evil.example.org

易受攻击的代码是

referer.contains(host)

引荐来源https://evil.example.org/?www.example.comhttps://evil.example.org/?www.example.com ,您可以看到其中包含www.example.com

引用检查是CSRF保护的一种较弱形式,因为它会解析此类错误,有时出于隐私目的,用户会在浏览器中禁用引用。

因此,您应同时检查OriginReferer ,但是前者有其自身的问题 如果您不关心保护旧的浏览器,那么这是一个很好的CSRF缓解措施。 旧版浏览器也可能会存在其他漏洞,从而使它们不安全,因此您可以辩称使用旧版浏览器的用户仍然是不安全的。

我们的应用程序是无状态的

这就使为什么您首先需要CSRF产生了疑问。

我需要为此主机配置域名吗?

听起来好像您需要一个配置变量,您可以在其中设置在referer origin refererorigin标题中接收的预期主机。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM