Amazon S3 Bucket 策略,只允许一个域访问文件

ome*_*ooq 5 amazon-s3 same-origin-policy amazon-web-services

我有一个 S3 存储桶,里面有一个文件。我只希望某个域能够访问该文件。我在存储桶上尝试了一些策略,但都不起作用,这个来自AWS 文档

{
    "Version": "2012-10-17",
    "Id": "http referer policy example",
    "Statement": [
        {
            "Sid": "Allow get requests originated from www.example.com and example.com",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket-name/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "http://www.phpfiddle.org/*",
                        "http://phpfiddle.org/*"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

为了测试该文件,我在 phpfiddle.org 上托管了一个代码并拥有此代码。但是我既不能通过直接从浏览器访问,也不能通过 phpfiddle 代码访问该文件。

<?php 
    $myfile = file_get_contents("https://s3-us-west-2.amazonaws.com/my-bucket-name/some-file.txt");
    echo $myfile;
    ?>
Run Code Online (Sandbox Code Playgroud)

这里是文件的权限,bucket本身也有同样的权限+上面的策略。

在此处输入图片说明

这只是一个示例链接,而不是实际工作的链接。

Edw*_*uel 5

限制访问特定 HTTP Referrer存储桶策略仅允许从您所在域的页面访问您的文件(HTTP Referrer 是您的域)。

假设您有一个域名为(www.example.com 或 example.com)的网站,其中包含指向您的 S3 存储桶 examplebucket 中存储的照片和视频的链接。

您无法从浏览器直接访问您的文件(直接在浏览器中键入文件 URL)。您需要从域中的任何页面创建链接/图像/视频标签。

如果您想file_get_contents从 S3 访问,则需要创建一个新策略以允许您的服务器 IP(请参阅示例)。将IP地址更改为您的服务器IP。

另一个解决方案是使用适用于 PHP 的 AWS 开发工具包将文件下载到本地。您还可以生成预签名 URL,以允许您的客户在有限的时间内直接从 S3 下载。