【问题标题】:Is there a downside to always returning Access-Control-Allow-Credentials?总是返回 Access-Control-Allow-Credentials 有缺点吗?
【发布时间】:2022-04-09 22:00:31
【问题描述】:

一个奇怪的 CORS 问题...

我的 example.com 服务器中有代码,它为所有 POST 和 GET 请求返回 Access-Control-Allow-Origin 响应标头,其中传递了 Origin 请求标头并且它具有值一个 example.com 子域(superman.example.combatman.example.com 等)。

我现在需要能够通过 cookie 进行 AJAX 调用,因此如果请求包含 cookie,我需要能够返回 Access-Control-Allow-Credentials 响应标头。

如果我看到 Cookie 请求标头,我可以添加额外的检查以返回 Access-Control-Allow-Credentials 响应标头,但为简单起见,我想知道 always是否有任何缺点> 返回来自我的子域的所有 GET/POST 请求的 Access-Control-Allow-Credentials 响应标头,其中指定了 Origin 请求标头。

这是我的代码(它是 Tcl iRule,FWIW):

when HTTP_REQUEST priority 200 {
    if { ( [HTTP::method] equals "OPTIONS" ) and
         ( [HTTP::host] ends_with "example.com"] ) and
         ( [HTTP::header exists "Access-Control-Request-Method"]) } {
        HTTP::respond 200 "Access-Control-Allow-Origin" [HTTP::header "Origin"] \
                          "Access-Control-Allow-Methods" "POST, GET, OPTIONS" \
                          "Access-Control-Allow-Headers" [HTTP::header "Access-Control-Request-Headers"] \
                          "Access-Control-Max-Age" "86400"       
    } elseif { ( [HTTP::host] ends_with "example.com"] ) and
               ( [HTTP::header exists "Origin"]) } {
        # CORS GET/POST requests - set cors_origin variable
        set cors_origin [HTTP::header "Origin"]
    }
}
when HTTP_RESPONSE {
    # CORS GET/POST response - check cors_origin variable set in request
    if { [info exists cors_origin] } {
        HTTP::header insert "Access-Control-Allow-Origin" $cors_origin
        HTTP::header insert "Access-Control-Allow-Credentials" "true"
    }
}

我知道,如果我返回 Access-Control-Allow-Credentials 响应标头,我必须指定一个命名(非通用)Access-Control-Allow-Origin 标头(以及 那个可能有 Vary 标头问题),但我还有什么需要注意的吗?

【问题讨论】:

  • 没有人回答这个问题,即使我添加了赏金:( 我假设没有缺点,但如果将来有人读到这个问题并且知道不同,请添加评论/跨度>
  • Ping :) 对我的回答有什么想法吗?

标签: security cors http-headers


【解决方案1】:

如果考虑defence in depth,无条件包括

Access-Control-Allow-Credentials: true

在响应中是一个坏主意。您的应用可能确实容易受到HTTP-header injection 的攻击。想象一下这样一种情况,攻击者可以通过 URL 中的查询参数在响应中注入一个任意的 HTTP 标头。在这种情况下,攻击者将能够有效地强制响应包含以下标头,

Access-Control-Allow-Origin: https://attacker.com
Access-Control-Allow-Credentials: true

这将使内容容易受到来自https://attacker.com 的跨域攻击。

James Kettlementions something similar 在他的 AppSecUSA 2016 演讲中,题为Exploiting CORS Misconfigurations for Bitcoins and Bounties

发现经典的 HTTP-header-injection 漏洞很常见,无论出于何种原因,您都无法将其注入响应内容。您不能只注入恶意 HTML;你唯一能做的就是设置HTTP 标题。而 CORS 提供了一种利用这一点的绝妙方法,因为您可以说

此内容对所有人开放!

使用 CORS,然后攻击者可以掌握该 [...]

【讨论】:

  • 这是一个合理的答案(对于一个 6 岁的问题:)。但正如您所说,只有当攻击者能够注入非常依赖于应用程序的 HTTP 响应标头(特别是 ACAO 响应标头)时,这才是真正的问题。虽然除非他们也能够移除现有的 ACAO 响应头,否则会有两个 ACAO 响应头返回给浏览器,这会导致大多数浏览器抛出错误。另外,当然,原始请求可能无法正常工作,因为 https://attacker.com 与 Origin 请求标头不匹配...但是您的观点很好。
猜你喜欢
  • 2016-01-21
  • 2022-01-17
  • 2019-12-14
  • 1970-01-01
  • 2018-03-27
  • 2014-09-01
  • 2022-01-13
  • 2017-03-21
  • 2015-04-14
相关资源
最近更新 更多