【问题标题】:S3 CORS Configuration: restricting to specific domains has no affect?S3 CORS 配置:限制到特定域没有影响?
【发布时间】:2018-03-12 23:22:21
【问题描述】:

我在 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 请求时获取对象,并在链接时接收403s从其他域到该存储桶中的 url。就目前而言,我仍然可以从http://dev.example.comhttp://localhost:4444 链接到该存储桶中的音频和图像文件。

我做错了什么?

【问题讨论】:

    标签: amazon-s3 cors


    【解决方案1】:

    在存储桶上设置 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 配置之外的其他内容。

    【讨论】:

      【解决方案2】:

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

      {
          "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>
      

      【讨论】:

        猜你喜欢
        • 2020-03-03
        • 2023-03-09
        • 1970-01-01
        • 2021-11-14
        • 2017-12-16
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 2012-09-03
        相关资源
        最近更新 更多