使用凭证和“基本上”任何来源的跨域资源共享

Posted

技术标签:

【中文标题】使用凭证和“基本上”任何来源的跨域资源共享【英文标题】:Cross-Origin Resource Sharing with credentials and "essentially" any origin 【发布时间】:2016-03-08 21:26:12 【问题描述】:

在 W3C 跨域资源共享建议 (http://www.w3.org/TR/cors/#resource-requests) 的第 3 步中指出:

如果资源支持凭据,请添加单个 Access-Control-Allow-Origin 标头,带有 Origin 的值 标头作为值,并添加单个 Access-Control-Allow-Credentials 以区分大小写的字符串“true”为值的标头。

否则,添加单个 Access-Control-Allow-Origin 标头,并带有 Origin 标头的值或字符串“*”作为值。

字符串“*”不能用于支持的资源 凭据。

这会反映在如下代码中:

if (policy.AllowAnyOrigin)

    if (policy.SupportsCredentials)
    
        result.AllowedOrigin = origin;
        result.VaryByOrigin = true;
    
    else
    
        result.AllowedOrigin = CorsConstants.AnyOrigin;
    

else if (policy.Origins.Contains(origin))

    result.AllowedOrigin = origin;

https://github.com/aspnet/CORS/blob/release/src/Microsoft.AspNet.Cors/CorsService.cs#L219

我的问题是这样的安全性如何?如果服务器被指示只是绕过限制,浏览器在允许的来源中拒绝 * 的意义何在?

【问题讨论】:

这是安全的! -- 它实际上是在执行此处发布的“解决方法”的 C# 版本:***.com/a/25623518/398630 -- 此代码违背了 CORS 限制的目的。 【参考方案1】:

@BrainSlugs83 的评论似乎回答了这个问题,所以我在这里复制它:

这不安全! -- 它本质上是在执行此处发布的“解决方法”的 C# 版本:https://***.com/a/25623518/398630

此代码违背了 CORS 限制的目的。

【讨论】:

以上是关于使用凭证和“基本上”任何来源的跨域资源共享的主要内容,如果未能解决你的问题,请参考以下文章

Ajax的跨域问题

7. Nginx资源的跨域访问

JavaScript中的跨域

使用跨域资源共享的跨域 POST 查询没有返回数据

Opera 的跨域资源共享

IE10 和图像/画布的跨域资源共享 (CORS) 问题