2011-04-13 125 views
19

我使用Amazon Cloudfront托管我所有网站的图片和视频,以更快地为我的用户提供服务,这些用户在全球各地都很分散。我还对Cloudfront上托管的元素应用非常积极的前向缓存,将Cache-Control设置为public, max-age=7776000防止亚马逊Cloudfront盗链

我最近发现我的烦恼,第三方网站是盗链我的Cloudfront服务器,以显示自己的网页上的图像,未经授权。

我已配置.htaccess以防止在我自己的服务器上进行盗链,但尚未找到在Cloudfront上执行此操作的方法,但似乎本机不支持该功能。令人烦恼的是,亚马逊的桶策略可用于防止盗链,它只对S3有效,它们对CloudFront的发布没有影响[link]。如果您想利用您必须直接从S3提供内容的策略。

淘汰我的服务器日志热点和手动更改文件名不是一个现实的选择,虽然我一直这样做,以结束最明目张胆的犯罪。

任何建议将受到欢迎。

回答

2

据我所知,目前还没有解决办法,但我有几个可能相关,可能是不相关的建议......

第一:许多人都问这个就的Cloudfront支持论坛。例如,参见herehere

很明显AWS可以从盗链中受益:更多的命中,他们对我们的收费越多!我认为我们(Cloudfront用户)需要开展某种精心策划的活动,让他们提供引用检查功能。

我想过的另一个临时解决方案是更改用于将流量发送到cloudfront/s3的CNAME。所以我们可以说你现在所有的图像发送至:

cdn.blahblahblah.com(其重定向到一些CloudFront的/ S3桶)

你可以将其更改为cdn2.blahblahblah.com和删除DNS条目cdn.blahblahblah.com

作为一项DNS更改,在他们的流量到达您的服务器附近任何地方之前,这会将当前所有盗链的人都击倒:DNS条目根本无法查找。您必须不断改变cdn CNAME才能使其生效(例如每月一次?),但它会起作用。

这实际上是一个比看起来更大的问题,因为这意味着人们可以更容易地抓取网站页面的整个副本(包括图像) - 所以这不仅仅是您丢失的图像,而且不仅仅是您支付提供这些图像。搜索引擎有时会得出结论,你的网页是副本,副本是原件......并且让你的流量砰砰响。

我想放弃Cloudfront,转而选择战略定位,超快速的专用服务器(从一个地方向全世界提供所有内容),让我对这些事情有更多的控制权。

无论如何,我希望别人有更好的答案!

+0

非常感谢这些意见。听起来像现在没有适当的解决方案。手动更改网址是可行的,但相当劳动密集型!我希望亚马逊能想出一个更好的方法。 – 2011-04-20 20:06:56

+0

如果更改CNAME,则不需要更改URL。您可以使用301重定向来捕捉旧CNAME中的引荐,一段时间后,您可以在切换到新的CNAME之前(告诉搜索引擎您已经走了)。如果有人阅读并想知道我的意思是CDN CNAME,那么Paul Stamatiou的指南“如何:Amazon Cloudfront入门”对此有很好的解释[http://paulstamatiou.com/how-to-getting-started-with -amazon-cloudfront],这是我找到的实现Cloudfront CDN的最简单,最清晰的指南。 – 2011-04-21 06:21:33

+0

我喜欢DNS的建议,定期删除所有的热门链接:) – 2012-01-09 09:18:22

8

我们有无数的盗链问题。最后,我们为许多图像创建了css精灵。将空白添加到底部/侧面或将图像组合在一起。

我们使用CSS在页面上正确显示了它们,但任何热链接都会错误地显示图像,除非它们复制了CSS/HTML。

我们发现他们不打扰(或不知道如何)。

9

官方的做法是使用signed urls为您的媒体。对于要分发的每个媒体片段,您可以生成特制的url,该url在给定的时间和源IP约束下工作。

静态页面的一种方法是为包含在该页面中的媒体生成临时URL,这些URL在页面的缓存时间内有效期为2倍。假设您的网页的缓存时间为1天。每两天,链接将失效,这就要求热门网站更新他们的网址。这不是万无一失的,因为他们可以构建工具来自动获取新的URL,但它会阻止大多数人。

如果你的页面是动态的,你不需要担心垃圾页面的缓存,所以你可以简单地生成只为请求者的IP工作的URL。

+1

感谢乔纳斯:这是一个相当复杂的过程,但? – 2011-11-22 19:13:07

+0

如何在生成签名url时访问请求者ip? – crazyCoder 2017-01-31 00:27:50

8

You can forward the Referer header to your origin since June 26!

  1. 转到CloudFront的设置
  2. 的分布
  3. 转到行为选项卡,并编辑编辑分布设置或者创建一个行为
  4. 往前行头到白名单
  5. 添加Referer作为白名单标题
  6. 将设置保存在右下角

请确保同时处理源自您的Referer标头。

+2

我只能将'Origin','Access-Control-Request-Headers'和'Access-Control-Request-Methods'添加到白名单中......并且链接的文档不会明确指出有关引用者的任何内容...... – 2015-07-09 13:27:14

+1

@BernhardVallant你应该可以看到选项[这里](http://i.imgur.com/OqR0kMT.png)。如果不是的话,那可能是因为你的价格计划。 – GFoley83 2015-09-21 23:01:00

3

截至2015年10月,您可以使用AWS WAF限制对Cloudfront文件的访问。 Here's an article from AWS宣布WAF并解释你可以用它做什么。 Here's an article,它帮助我设置了我的第一个ACL,以根据引用来限制访问。

基本上,我创建了一个默认动作为DENY的新ACL。我添加了一个规则,用于检查我的域名(小写)的referer头字符串的末尾。如果它通过该规则,它允许访问。

分配我的ACL我的Cloudfront分配后,我试图加载我的数据文件的一个直接在Chrome和我得到这个错误:

Chrome error message when trying to access a Cloudfront file directly after applying a WAF ACL

0

这个问题提到的图像和视频文件。
引用者检查不能用于保护多媒体资源免受盗链,因为当请求使用HTML5播放的音频或视频文件时,某些移动浏览器不会发送引用者标头。
我相信iPhone和Safari上的Safari和Chrome以及Android上的Safari。
太糟糕了!谢谢你,苹果和谷歌。

0

如何使用签名cookie?使用自定义策略创建签名的cookie,该策略还支持您要设置的各种限制,并且它是通配符。