如何仅在我的网站上提供 S3 对象

How to serve S3 object only in my website

我有一个 Laravel 应用程序,它使用 S3 存储个人资料图片,但也用于合同等敏感内容。 例如,如果我提供一张图片,我会得到这个 URL:"bucket_name".s3."region".scw.cloud/"Content".

只有当用户在我的网站上时,我才想获取这个 URL 的内容。 因为现在如果我 copy/paste 每个人都可以访问它的地址。

感谢您的帮助

有多种方法可以处理此问题,具体取决于您希望拥有的东西的安全程度:

  1. 正如@jarmod 所建议的,您可以设置一个引用 header 过滤器。这行得通,但如果您有坚定的黑客意识,则可以伪造。
  2. 您可以为文档创建一个presigned URL。这允许在您决定的时间内进行访问。因此,例如,如果您只想要一个有效期为 3 分钟的 URL,您可以生成它并继续发送。即使有人得到了 URL 它的有效期也有限。
  3. 您的 Laravel 应用程序可以充当 S3 内容的代理。您的 S3 存储桶将是私有的,您的应用程序将有权从该存储桶中读取数据。当请求文件时,它将转到您的应用程序,应用程序将从 S3 读取文件并将其传递给最终用户。通过这种方式,您可以确定您的用户已登录并能够访问该文件。但是,这可能需要更多时间,因为现在您需要从 S3 读取(尽管您可以实现一些缓存),然后将文件写入最终用户。

您可以在存在 HTTP 引荐来源网址 header 的情况下访问存储桶中的 objects。以下是 S3 存储桶策略的示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucket/*"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "http://www.example.com/*",
                        "http://example.com/*"
                    ]
                }
            }
        }
    ]
}

请注意:

  1. HTTP headers 可以是 spoofed
  2. 推荐人 header 是可选的,因此并非所有合法客户都会提供它