为什么 S3 对象可以通过 HTTP(无 S3 API 协议)获得,而不是预期的?

问题描述 投票:0回答:1

在与 S3 打交道大约 10 年之后,我觉得我可能错过了一些东西。我有一个特殊情况:

  • 类似的网址
    https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>
    是 通过 HTTP 提供对象。
  • 对象是使用“公共读取”ACL 写入的
  • 存储桶对象所有权 = 对象编写器,ACL 已启用
  • bucket 静态网站托管已禁用。
  • 显然不涉及预签名 URL。
  • 针对此存储桶上的窄前缀路径启用了 CloudFront 分发,该路径与我可以检索的对象键不匹配。

我希望任何人都可以使用 AWS API for GetObject 自由访问具有公共读取 ACL 的对象,无需经过 AWS 验证。但是,我不希望出现这种 http 访问行为。即使启用静态网站托管,URL 也会不同。

amazon-web-services amazon-s3
1个回答
0
投票

S3 API 作为一系列 REST API 调用(以及出于向后兼容性原因的 SOAP API 调用)实现。 具体来说,如果我们浏览 GetObject 调用的文档并删除未标记为必需的每个项目,我们将得到如下调用:

GET /Key HTTP/1.1
Host: Bucket.s3.amazonaws.com

换句话说,任何用户代理(例如浏览器)都会发送正常的 HTTPS GET 请求。 用户代理将包含其他标头,但 S3 将忽略那些它不直接支持的标头。

因此,假设一个对象不需要授权标头,因为它具有公共读取 ACL,那么浏览器将直接加载它,就像进行 GetObject 调用一样,因为实际上确实如此。

© www.soinside.com 2019 - 2024. All rights reserved.