【问题标题】:AWS S3 - storing and serving non-private imagesAWS S3 - 存储和提供非私有图像
【发布时间】:2018-03-02 23:21:31
【问题描述】:

我是第一次使用Flysystem 使用 S3 实现文件上传(在这种情况下特别是用户个人资料头像图像)。我目前已经创建了一个 S3 存储桶,用户可以上传一张图片,然后可以在存储桶控制台中在线查看。

我现在需要能够在请求时显示这些图像(即查看该用户的个人资料)。我假设这个过程是生成 URL(例如https://s3.my-region.amazonaws.com/my-bucket/my-filename.jpeg)并将其用作图像标签的src,但是要做到这一点,文件(或存储桶)必须标记为公共。这对我来说似乎是合理的,因为其中的文件并不是真正私密的。但是,当您将存储桶更新为公开状态时,您会看到一条消息:

我们强烈建议您永远不要向您的 S3 存储桶授予任何类型的公共访问权限。

是否有一种不同的或更安全的方式来实现像这样的直接图像链接,而 AWS 的新手却没有看到?

【问题讨论】:

  • 您的文件上传代码可以指定特定文件对每个人都具有只读访问权限。在 PHP SDK 中,这是 'ACL' => 'public-read'
  • 参见flysystem.thephpleague.com/api 中的Manage Visibility - 您也可以在文档链接中使用读取流并代理和/或缓存它

标签: php amazon-web-services amazon-s3 flysystem


【解决方案1】:

之所以存在警告,是因为许多人无意中公开了信息。但是,如果您乐于让 Internet 上的任何人随时访问这些特定文件,那么您当然可以公开各个对象或创建 Amazon S3 存储桶策略以公开特定路径。

另一种授予访问权限的方法是创建一个S3 Pre-Signed URL,这是一个授予对私有对象访问权限的有时间限制的 URL。

您的应用程序将负责验证是否应授予用户对特定对象的访问权限。然后它将生成 URL,提供访问的持续时间。然后,您的应用程序可以将 URL 插入到 src 字段中,图像将正常显示。但是,一旦持续时间过去,它将无法再访问。

这通常用于提供对私有文件的访问——类似于 DropBox 提供对私有文件的访问而不使文件本身公开的方式。

【讨论】:

    【解决方案2】:

    我建议将 cloudfront 放在静态资产的最前面(没有双关语),这样它就可以在他们的整个数据中心提供服务,而不仅仅是您上传的区域,我认为这会减少您的费用,因为它不使用 S3 存储桶中的带宽。 这样您就可以为您的 S3 存储桶授予云端权限,而无需手动在您的存储桶中设置公开文件。 Google 如何为 Cloudfront 和 S3 设置 IAM 用户以帮助您进行设置。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2018-07-13
      • 2018-04-24
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多