带有CloudFlare的S3存储桶:防止热链接

时间:2016-11-26 15:15:29

标签: amazon-s3 cloudflare hotlinking

我正在使用名为images.example.com的Amazon S3存储桶,它使用以下网址通过Cloudflare CDN成功提供内容:

https://images.example.com/myfile.jpg

我想阻止图片和其他内容的热链接限制只能访问引用域:example.com以及我用作开发服务器的另一个域。

我尝试了一个存储桶策略,它允许来自特定域并拒绝任何域而不是特定域:

 {
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [
    {
        "Sid": "Allow get requests referred by www.example.com",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::images.example.com/*",
        "Condition": {
            "StringLike": {
                "aws:Referer": [
                    "http://www.example.com/*",
                    "http://example.com/*"
                    ]
            }
        }
    },
    {
        "Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::images.example.com/*",
        "Condition": {
            "StringNotLike": {
                "aws:Referer": [
                    "http://www.example.com/*",
                    "http://example.com/*"
                    ]
            }
        }
    }
]

}

测试一下。我在不同的服务器上上传了一个小网页:www.notExample.com我尝试使用以下链接来链接图像:

 <img src="https://images.example.com/myfile.jpg">

但无论如何都会显示热链接图片。

我还尝试了以下CORS规则

 <CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>http://www.example.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
   </CORSRule>
 </CORSConfiguration>

这些都没有阻止热链接。我尝试使用存储桶策略和CORS(一个或另外两个加上两个)的组合来清除CloudFlare中的缓存文件,但没有任何作用。

这似乎是一件相对简单的事情。我做错了什么?

1 个答案:

答案 0 :(得分:3)

Cloudflare是一个内容分发网络,可以将信息缓存到最终用户附近。

当用户通过Cloudflare访问内容时,内容将从Cloudflare的缓存中提供。如果内容不在缓存中,Cloudflare将检索内容,将其存储在缓存中并将其提供给原始请求。

因此,您的Amazon S3存储桶策略将无法与Cloudflare一起使用,因为页面请求来自Cloudflare(不是用户的生成推荐人的浏览器),或直接来自Cloudflare的缓存(所以请求永远不会到达S3)。

您需要使用引荐来源规则配置Cloudflare ,而不是S3。

请参阅:What does enabling CloudFlare Hotlink Protection do?

一些替代方案:

  • 使用Amazon CloudFront - 它可以使用签名URL serve private content - 您的应用程序可以在创建HTML页面时通过生成特殊URL来授予访问权限。
  • 直接从Amazon S3提供内容,该S3可以使用referer规则。 Amazon S3还支持您的应用程序可以生成的pre-signed URLs