【问题标题】:what does request.getHeader("host") return when multiple legs are configured配置多条腿时 request.getHeader("host") 返回什么
【发布时间】:2017-01-01 19:36:04
【问题描述】:

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

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

我们需要遵循两个步骤: 1.检查标准头以验证请求是同源的 2. 并检查 CSRF 令牌

1.检查标准标头以验证请求是否来自同一来源: 建议对照推荐人检查主机。由于在请求中更改referer和host标头并不容易,因此检查Referer是否包含Host是我们可以做的第一个检查,我已经处理了。

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;
        }

这在我只有一条腿的本地和测试环境中正常工作。但是当我在有两条腿的舞台环境中测试它时,Referer 和主机名是不同的。

主机名与机器名类似

machin002:8080

但我期待像

这样的域名
sample.domain.com

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

【问题讨论】:

    标签: java dns csrf servlet-filters request-headers


    【解决方案1】:

    首先,您的推荐人检查很弱。

    假设合法请求的主机头是www.example.com

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

    易受攻击的代码是

    referer.contains(host)
    

    Referer 将是https://evil.example.org/?www.example.com,您可以看到其中包含www.example.com

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

    因此,您应该同时检查OriginReferer,但前者有its own problems。如果您不关心保护旧浏览器,那么这是一个很好的 CSRF 缓解措施。旧浏览器也可能存在其他使它们不安全的错误,因此您可以争辩说使用旧浏览器的用户无论如何都是不安全的。

    我们的应用是无状态的

    这让人质疑为什么首先需要 CSRF?

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多