S3 CORS配置:限制到特定域没有影响?

时间:2017-10-01 19:39:09

标签: amazon-s3 cors

我在S3上有一个包含所有内容的存储桶,以及以下CORS配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://example.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>http://localhost:3333</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

使用该配置,我希望 能够在从http://example.comhttp://localhost:3333请求时获取对象,并接收{{ 1}}链接到其他域中该存储桶中的URL时。就目前而言,我仍然可以从403以及http://dev.example.com链接到该广告素材中的音频和图像文件。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

在存储桶上设置CORS配置本身不会阻止任何人嵌入从该存储桶提供的图像或音频 - 否则不会导致对存储桶的任何请求被拒绝。你不能只通过CORS配置来做到这一点。

浏览器是实际实施所有跨源限制的地方,浏览器允许将音频和图像的跨源URL嵌入到任何文档中,无论CORS设置如何。

但默认情况下,浏览器不允许前端JavaScript代码访问来自使用XHR或Fetch或来自JavaScript库的Ajax方法的跨源请求的响应。这是CORS进入的唯一地方。它不会影响正常的跨音频嵌入音频和图像的行为。相反,它允许您从服务器端告诉浏览器您要从哪个起源取消阻止 XHR / Fetch / Ajax请求

在配置CORS支持时,您的存储桶执行的所有操作只是发送Access-Control-Allow-Origin响应标头和其他CORS响应标头。就是这样。

所有实际执行或放宽跨域限制都是由客户端的浏览器完成的 - 而不是在服务器端由您的存储桶完成。换句话说,就CORS配置而言,您在存储桶上设置的内容基本上只是浏览器使用的咨询信息。

因此,无论您在存储桶上进行何种CORS配置,它仍然会接受来自所有客户端的请求,否则它将会来源;换句话说,来自所有来源的所有客户仍然继续得到它的反应,就像他们原样一样。

但是浏览器只会将您的存储桶的响应暴露给来自特定来源的前端JavaScript代码的跨源请求,如果您的存储分区设置为选择加入以通过响应来允许请求允许该来源的Access-Control-Allow-Origin标题。

这是您在存储桶上使用CORS配置可能造成的唯一影响。你不能只通过CORS配置使它只允许它所服务的音频或图像文件只是由特定的来源嵌入。为此,您需要使用除CORS配置之外的其他内容。

答案 1 :(得分:0)

首先,您必须关闭所有公共访问权限,然后 您应该像这样设置存储桶策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::013721739313:user/s3-testing-user"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::s3testingankit1/*"
        },
        {
            "Sid": "Allow get requests originating from https://z2psandbox.today/*.",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::s3testingankit1/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": "https://example.com/*"
                }
            }
        }
    ]
}

然后设置CORS

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>https://example.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>