针对公共存储桶的S3 CORS政策

时间:2019-04-13 17:45:09

标签: amazon-s3

这似乎很容易,但是我不知道自己缺少什么。 我有一个从我的网站获取的带有js脚本的公共存储桶。我注意到我没有将obj is None标头发送到S3,这不是必需的,并且在没有任何CORS配置的情况下一切正常。

更重要的是,即使在我手动将Origin标头添加到该GET调用并通过以下方式明确禁止GET和我的域之后,也是如此:

Origin

我仍然可以获取内容。这是怎么回事?

3 个答案:

答案 0 :(得分:1)

相同来源策略是浏览器强制实施的一项功能,该功能可防止在一个网站上运行的JavaScript从另一个网站读取数据。 (这会阻止使用JavaScript的随机网站使用您的浏览器来跳过公司防火墙并访问您的Intranet或使用Cookie读取GMail)。

CORS允许网站放松相同起源策略,以允许其他网站以这种方式读取数据。

CORS不是身份验证/授权。您的公开桶是公开

您没有使用JavaScript从存储桶中读取数据,而是直接从存储桶中加载JS。

答案 1 :(得分:1)

好吧,在与Quentin交谈之后,我想我知道我在误解CORS应该如何工作。 在Java世界中,通常会在Origin不匹配时拒绝请求。这是mentioned所在的另一个线程。 如果以Spring为例(在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);
}

您可以找到代码here

但是令我惊讶的是,这与其他堆栈和服务器端技术并不常见。另一种常见的方法是将其具有的所有CORS配置发送给浏览器,然后由其决定。

S3更加棘手:仅当存储桶CORS规则与启用了CORS的请求匹配时才发送CORS响应标头(一个请求,即Origin标头)。否则,将没有CORS响应标头。

答案 2 :(得分:0)

让我们解决这个问题,并尝试了解CORS的基本原理。

什么是跨域请求和CORS?

  

跨源请求:对资源的请求(例如   原点之外的图片或字体)称为跨原点   请求。

当您从另一个来源请求受保护的资源时,

CORS会很有帮助。

  

跨域请求共享:在源之外对受受保护资源的请求(例如图像,字体或XHR请求)被称为跨域请求。

为什么可以使用身份验证/授权令牌保护资源时需要CORS?

CORS是第一道防线。当客户端(例如,浏览器)和服务器都支持CORS时,客户端将仅允许从特定来源到服务器的请求,如服务器指示的那样。

默认情况下,浏览器应按照构建浏览器的准则实施同源策略安全机制。几乎所有现代浏览器都实施同源策略,该策略指示浏览器在源相同的情况下允许对服务器的请求。

同源策略是浏览器的安全性机制,您可以详细了解here。正是由于浏览器的这一特性,当指定来源和来源来源不同时,浏览器会阻止所有请求。 (服务器甚至都没有意识到这种情况,哇!)

对于更简单的用例,当资产(js,CSS,图像,字体),XHR资源可以以相同来源访问时,则无需担心CORS。

如果资产托管在另一个来源上,或者XHR资源托管在具有与源不同的域的服务器上,则浏览器默认不会拒绝跨域请求。只有使用适当的CORS请求和响应标头,浏览器才可以发出跨域请求。

让我们看一下请求和响应头。

Request headers

  • 来源
  • 访问控制请求方法
  • 访问控制请求标头

Response headers

  • 访问控制允许来源
  • 访问控制允许凭据
  • 访问控制公开标题
  • 访问控制最大年龄
  • 访问控制允许方法标题访问控制

要设置CORS,需要OriginAccess-Control-Allow-Origin标头。浏览器将自动向每个请求添加Origin标头,因此开发人员只需配置Access-Control-Allow-Origin响应标头。

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

在使用CORS时,需要注意几件事。

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

此外,如果您想限制GET访问,请在私有存储桶上使用S3预签名URL。