S3 CORS策略公共桶(S3 CORS policy for public bucket)

2019-10-16 13:18发布

这似乎是很容易的,但我不知道我错过了什么。 我有一个js脚本,我从我的网站获取一个公共桶。 我注意到,我不送Origin头S3,它不是必需的,一切正常,没有任何CORS配置。

更重要的是,即使我手动添加Origin标作为要打电话,明令禁止的GET,并通过我的域名:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://www.nonexistingdomain.com</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我仍然可以获取内容。 这里发生了什么?

Answer 1:

同源策略是防止在一个网站上运行从不同的网站中读取数据JavaScript的浏览器执行功能。 (这将停止使用JavaScript使用浏览器来跳过您的企业防火墙和访问您的Intranet或与您的cookies读取您的Gmail随机网站)。

CORS允许一个网站放宽同源策略,以允许其他网站从中读取数据的方式。

CORS不认证/授权。 你公开的桶是公开的

你是不是使用JavaScript来读取你的水桶数据 ,你直接从铲斗装载的JS。



Answer 2:

好吧,昆汀谈话之后,我想我明白我在哪里曲解CORS应该如何工作。 在Java世界中,这是一个非常普遍的做法实际上拒绝原点时不匹配的请求。 这里是它的另一个线程中提到 。 如果我们把春天为例(这是在Java世界中的事实上的标准),这里是当加入CORS过滤器会发生什么:

    String allowOrigin = checkOrigin(config, requestOrigin);
    ...

    if (allowOrigin == null) {
        logger.debug("Reject: '" + requestOrigin + "' origin is not allowed");
        rejectRequest(response);
        return false;
    }

哪里:

/**
 * Invoked when one of the CORS checks failed.
 */
protected void rejectRequest(ServerHttpResponse response) {
    response.setStatusCode(HttpStatus.FORBIDDEN);
}

你可以找到的代码在这里 。

但让我吃惊,它不与其他堆栈和服务器端技术,比如常见的做法。 另一种常见的做法是送他们有什么CORS配置浏览器,离开的决定吧。

S3是更加棘手:它仅当铲斗CORS规则匹配启用CORS请求(qith Origin标头的请求)发送CORS响应标头。 否则,就不会有CORS响应头。



Answer 3:

让我们分析一下该问题并试图了解CORS的基础。

什么是跨来源请求和CORS?

跨源请求:一种用于资源(如图像或字体)请求的来源的外称为跨来源请求。

CORS是有帮助的,当你请求从其他产地受保护的资源。

跨源请求共享:一种用于在受保护的资源(如图像或字体或XHR请求)请求的来源的外称为跨来源请求。

为什么我们需要CORS当资源可以通过使用认证/授权令牌进行保护?

CORS是防守的第一道防线。 当两个客户端(例如,浏览器)和服务器CORS感知,客户端将允许来自特定的起源按照指示通过服务器的服务器只请求。

默认情况下,浏览器都应该执行同源策略的安全机制,按照打造的浏览器的准则。 几乎所有的现代浏览器执行该指示浏览器,使请求到服务器如果起点是一样的同源策略。

同源策略是浏览器的安全机制,你可以阅读更多关于它在这里 。 这是因为浏览器,但浏览器时指定来源和源来源不同的所有请求此功能。 (服务器甚至不知道这种情况的发生,哇!)

对于比较简单的使用情况,当资产(JS,CSS,图片,字体),XHR资源具有相同起源访问,也没有必要担心CORS。

如果资产上的另一个来源或XHR资源托管托管在与源,然后浏览器不会否认默认请求跨域不同的域服务器。 只有具有相应的CORS请求和响应头,浏览器都允许做跨域请求。

让我们来看看在请求和响应头。

请求头

  • 起源
  • 访问控制请求法
  • 访问控制请求报头

响应头

  • 访问控制允许来源
  • 访问控制允许的凭据
  • 访问控制展露报头
  • 访问控制 - 最大 - 年龄
  • 访问控制允许的方法访问控制允许报头

对于建立CORS的Origin ,以及Access-Control-Allow-Origin需要头。 浏览器会自动添加Origin头球每个请求,所以开发人员需要只配置Access-Control-Allow-Origin响应头。

为了保护访问只从特定域资源,S3提供了配置CORS规则的选项。 如果价值Access-Control-Allow-Origin标题是*所有的跨域请求是允许的,否则定义一个逗号分隔的域列表。

有一对夫妇,你需要知道使用CORS时的事情。

  • 这是防守的第一级受保护的资源,而不是最终的防御。
  • 你仍然需要实现合适的身份验证和授权,以在服务器上执行CRUD操作的资源。
  • 执行同源策略是建立在浏览器和不是强制性的准则。
  • 只有当客户接受头CORS标头是有用的。 只有现代浏览器接受CORS标头。 如果你不使用的浏览器,使资源请求,然后CROS不适用。
  • 如果你在浏览器的地址栏中键入链接时,CORS规则并不适用于因为浏览器不会在发送Origin头到服务器。 该Origin头是由浏览器只对后续资源请求(样式表,js文件,字体)和XHR请求被发送起源。
    • 如果通过直接输入在地址栏中的链接访问的资源文件,浏览器不发送Origin头这一要求。

另外,如果你想限制可以访问使用S3上的私人桶前签署的URL。



文章来源: S3 CORS policy for public bucket
标签: amazon-s3