如何在不使用签名URL的情况下防止Amazon S3上的热链接?

23

有没有办法在不使用签名URL的情况下防止Amazon S3上的热链接?

7个回答

26

你需要一个桶策略,既允许来自你的域名的引用者,又拒绝不来自你的域名的引用者。我发现,如果不包含明确的否定,图片可能会被热链接 - 许多指南和示例只提供允许策略,不提及拒绝部分。

这是我的策略,请将BUCKET-NAME和YOUR-WEBSITE更改为您自己的详细信息:

{
  "Version": "2008-10-17",
  "Id": "",
  "Statement": [
    {
      "Sid": "Allow in my domains",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::BUCKET-NAME/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "http://www.YOUR-WEBSITE.com/*"
          ]
        }
      }
    },
    {
      "Sid": "Deny access if referer is not my sites",
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::BUCKET-NAME/*",
      "Condition": {
        "StringNotLike": {
          "aws:Referer": [
            "http://www.YOUR-WEBSITE.com/*"
          ]
        }
      }
    }
  ]
}

谢谢你。这真的帮了我很多,而且运行得很好。我的唯一建议是,也许你可以在答案中添加一个条目“http://YOUR-WEBSITE.com/*”,以涵盖所有情况,因为那就是我的问题所在。不过还是感谢你提供完美的脚本。 - Paolo Broccardo
这个很好用,但是如何允许空引荐者呢?当通过CSS链接到图像时,引荐者为空,图像无法显示。 - prophoto
太好了!你救了我。 - Ricardo

12

23
请在此处回复答案,而不是将答案链接。 - Ollie Glass

3

你可以在他们的官方文档中查看。

examplebucket更改为您的存储桶名称,将example.com更改为您的域名。

"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":[
  {
    "Sid":"Allow get requests originating from www.example.com and example.com.",
    "Effect":"Allow",
    "Principal":"*",
    "Action":"s3:GetObject",
    "Resource":"arn:aws:s3:::examplebucket/*",
    "Condition":{
      "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
    }
  }
]
}

3
我使用Apache RewriteMap将相对链接重映射到选择的文件扩展名——*.jpg、*.gif、*swf、*.fla,然后将其重定向到Cloudfront。基本上将您的图像的URL呈现为站点的相对链接。这并不能完全防止S3/Cloudfront URL的被盗用,但增加了窃贼的难度。
也许值得一试,通过htaccess应用热链接限制,并采用上述方法。我自己还没有尝试过。

什么?这不意味着每个图像请求都必须先经过您的服务器才能到达CloudFront服务器吗?如果是这样,那使用CDN的目的不就被打败了吗?(对于像视频这样的大文件来说并非如此,但对于图像来说呢?) - Doug McClean
请求将触及您的Web服务器,浏览器会被告知它应该去哪里获取文件,但浏览器的历史记录永远不会更新为CDN的实际URL。这本质上是大多数前端控制器框架中“路由”的相同技巧,但在这种情况下,请求从未转发到应用程序服务器,只有Apache。 - Butifarra
@Claude,如果使用下载管理器或类似curl / wget的工具而不是浏览器,那么重定向是否会透明,从而成为启用热链接的一种方式? - bdutta74
1
@icarus74 很抱歉回复晚了。当然,任何能够浏览和理解HTTP代码的工具都应该能够跟随重定向到CDN,从而抵消maddie建议的规则的影响。最好的做法是通过设置Robert Mao上面链接中建议的存储桶策略来保护您的CDN免受不必要的请求。 - Butifarra

1

这里有一个很好的教程链接。一定要查看评论,因为网站代码中有一个空格字符会导致解决方案无法正常工作。


0

1
Cloudfront不能防止盗链或遵守S3的策略。 - Ollie Glass

-2

不完全是这样。您可以运行一个EC2实例并通过它进行代理。


2
不行,这违背了 CDN 的初衷。 - FlavorScape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接