如何仅在我的网站上提供 S3 对象
How to serve S3 object only in my website
我有一个 Laravel 应用程序,它使用 S3 存储个人资料图片,但也用于合同等敏感内容。
例如,如果我提供一张图片,我会得到这个 URL:"bucket_name".s3."region".scw.cloud/"Content"
.
只有当用户在我的网站上时,我才想获取这个 URL 的内容。
因为现在如果我 copy/paste 每个人都可以访问它的地址。
感谢您的帮助
有多种方法可以处理此问题,具体取决于您希望拥有的东西的安全程度:
- 正如@jarmod 所建议的,您可以设置一个引用 header 过滤器。这行得通,但如果您有坚定的黑客意识,则可以伪造。
- 您可以为文档创建一个presigned URL。这允许在您决定的时间内进行访问。因此,例如,如果您只想要一个有效期为 3 分钟的 URL,您可以生成它并继续发送。即使有人得到了 URL 它的有效期也有限。
- 您的 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/*"
]
}
}
}
]
}
请注意:
- HTTP headers 可以是 spoofed
- 推荐人 header 是可选的,因此并非所有合法客户都会提供它
我有一个 Laravel 应用程序,它使用 S3 存储个人资料图片,但也用于合同等敏感内容。
例如,如果我提供一张图片,我会得到这个 URL:"bucket_name".s3."region".scw.cloud/"Content"
.
只有当用户在我的网站上时,我才想获取这个 URL 的内容。 因为现在如果我 copy/paste 每个人都可以访问它的地址。
感谢您的帮助
有多种方法可以处理此问题,具体取决于您希望拥有的东西的安全程度:
- 正如@jarmod 所建议的,您可以设置一个引用 header 过滤器。这行得通,但如果您有坚定的黑客意识,则可以伪造。
- 您可以为文档创建一个presigned URL。这允许在您决定的时间内进行访问。因此,例如,如果您只想要一个有效期为 3 分钟的 URL,您可以生成它并继续发送。即使有人得到了 URL 它的有效期也有限。
- 您的 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/*"
]
}
}
}
]
}
请注意:
- HTTP headers 可以是 spoofed
- 推荐人 header 是可选的,因此并非所有合法客户都会提供它