总是返回Access-Control-Allow-Credentials有缺点吗?



一个奇怪的CORS问题…

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

我现在需要能够使AJAX调用传递cookie,所以如果请求包含cookie,我需要能够返回Access-Control-Allow-Credentials响应头。

如果我看到Cookie请求报头,我可以添加一个额外的检查来返回Access-Control-Allow-Credentials响应报头,但为了简单起见,我想知道总是为所有GET/POST请求返回Access-Control-Allow-Credentials响应报头从我的子域,其中指定了Origin请求报头。

这是我的代码(它是一个Tcl规则,fww):

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报头问题),但是还有什么我需要注意的吗?

考虑纵深防御,无条件包括

Access-Control-Allow-Credentials: true
在响应中使用

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

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

这将使内容对https://attacker.com的跨域攻击敞开大门。

James Kettle在他的AppSecUSA 2016演讲中提到了类似的事情,题为利用CORS错误配置获取比特币和赏金:

发现经典的http头注入漏洞是很常见的,无论出于何种原因,您都无法注入到响应内容中。你不能只是注入恶意的HTML;你唯一能做的就是设置HTTP头。CORS提供了一种很好的利用方法因为你只需要输入

此内容对所有人开放!

使用CORS,然后攻击者可以得到它[…]

最新更新