谷歌存储、亚马逊S3或谷歌应用引擎BlobStore

18

我打算使用Google App Engine构建一个网站。我的公共网站包含成千上万张图片。我想将这些图片存储在云端:Google Storage或Amazon S3或Google App Engine BlobStore。问题是图像的热链接。

  1. 关于Google Storage,我搜索了一下并没有找到防止图像热链接的方法。(虽然我非常喜欢它的命令行工具gsutil)

  2. Amazon S3有“查询字符串认证”,可以生成过期的图片URL。但这对SEO非常不利,不是吗?因为经过一年以上的时间才能将图片及其相关URL放入Google Images中,不断更改URL会产生负面影响。我相当确定更改此URL时,GoogleBot来访时会立即产生负面影响。(更新:使用Bucket策略可以更好地防止Amazon S3中的图像热链接。点击此处查看详情。

  3. Google App Engine BlobStore?我必须通过Web界面手动上传图像,并且 它也生成可变的URL。(更新:由于我对Blobstore的无知,我犯了一个错误。使用Google App Engine BlobStore,您可以使用任何URL来提供您想要的图像。)

我需要的是简单的引荐者保护:仅在引荐者是我的网站时显示图片。

有没有更好的方法来防止图像热链接?我不想因云带宽的极高费用而破产。

更新:

从这三个中选择仍然很困难,因为它们各有优缺点。 BlobStore似乎是最终选择。


2
我不确定,但是如果您防止热链接,我会感到惊讶,如果您能将图像放入Google图像搜索中。 - Bill Lynch
@sharth:说得好。我刚刚搜索了一下,Googlebot 中没有 referrer。只有一个代理:Googlebot-Image/1.0。 - DocWiki
你成功防止了热链接吗?干杯。 - vtortola
4个回答

7
最简单的选择是使用Blobstore。您可以提供任何上传界面,只要您编写它,Blobstore就不会限制您的下载URL,只限制您的上传URL。您可以通过设置适当的标头来在任何URL下提供Blobstore图像,或者您可以使用get_serving_url利用内置的快速图像服务支持,生成加密但一致的URL(但不允许您进行引用者检查)。
我建议您考虑一下这是否是一个实际存在的问题。按照今天的标准,由几个热链接图像消耗的带宽非常小,而且这并不是一种特别常见的做法。正如@sharth在评论中指出的那样,这很可能会影响SEO,因为图像搜索倾向于在单独的窗口中显示图像,并链接到托管它们的页面。

有没有命令行工具可以将图像上传到Blobstore? - DocWiki
@DocWiki 不,但是blobstore API可以通过remote_api进行访问,所以你可以相对简单地编写一个。 - Nick Johnson
既然你在这里,我想了解一些关于Blobstore的事情。我知道在app engine中每个请求的限制是30秒。当我将视频上传到app engine Blobstore时,这个限制是否适用?Blobstore的最大单个文件大小为2GB,如果通过HTML表单上传可能需要几个小时。这时30秒每个请求的限制是否适用? - DocWiki
@DocWiki 30秒的执行时间限制仅适用于您的代码实际执行所花费的时间 - 这个时间直到用户发送完整的请求才开始计算,并在您发送响应(他们收到之前)立即结束。 - Nick Johnson

1
每当我回到编写统计网络服务的代码时,我都需要动态生成图像和图表。生成的图像将取决于请求参数、数据存储库的状态和一些标头信息。
因此,如果我是你,我会编写一个REST网络服务来提供这些图像。这并不太困难。这也很有趣,因为如果您不喜欢特定的IP地址,您可以显示舌头卡在嘴边的卡通(或OBL桑巴舞蹈的动画GIF),而不是数据请求的图像。
对于您的情况,您会检查HTTP标头中的引用者(或referrer)吗?我表示怀疑,因为人们可以并且会隐藏、清空甚至伪造HTTP标头中的引用者字段。
因此,不仅要检查引用者字段,还要创建一个数据字段,其中值会发生变化。该值可以是简单的匹配值。
在第二次世界大战期间,罗斯福和丘吉尔通过加密进行通信。他们每个人都有一堆相同的磁盘,其中包含加密机制。每次交谈后,两人都会丢弃磁盘(并永远不会重复使用),以便下一次再次交谈时,他们会拿起堆栈上的下一个磁盘。

与其使用一堆磁盘,您的图像消费者和图像提供者将携带相同的32位令牌堆栈。32位将为您提供约4十亿个10分钟周期。该堆栈是随机排序的。由于众所周知,“随机生成器”并非真正随机,实际上在某种程度上是可以预测的算法,如果提供足够长的序列,您应该使用“真正的随机生成器”或每周重新排序堆栈。

由于延迟问题,您的提供者将接受来自当前期间、上一个期间和下一个期间的令牌。其中期=扇区。

您的ajax客户端(可能是gwt)在浏览器上每10分钟从服务器获取更新的令牌。ajax客户端将使用该令牌请求图像。您的图像提供程序服务将拒绝过时的令牌,您的ajax客户端必须从服务器请求新的令牌。

这不是一种防火方法,但它是防震的,因此可以减少/阻止垃圾邮件请求的数量(我认为几乎为零)。

我生成“真正随机”序列的方法是快速而简单的。我通过手动重新排序或删除序列的值,花费几分钟时间对算法生成的“随机”序列进行进一步处理。这会破坏任何算法的可预测性。也许你可以编写一个“扔扳手”的程序。但是,算法扔扳手只是在另一个可预测的算法之上添加了一个可预测的算法,这根本没有降低总体的可预测性。
你可以通过使用循环冗余匹配作为快速而简单的“加密”令牌匹配机制来进一步限制情况。
假设你有一个被分成8个等距扇区的圆。你需要一个3位二进制数来寻址这8个扇区中的任何一个。想象一下,每个扇区都被进一步细分为8个子扇区,现在你将能够用额外的3个字节寻址每个子扇区,总共6个字节。

您计划每10分钟更改匹配值。您的图像提供商和所有已批准的消费者将拥有相同的扇区地址堆栈。每十分钟,他们会丢弃扇区地址并使用下一个地址。当消费者向您的提供商发送匹配值时,它不会发送扇区地址,而是发送子扇区地址。因此,只要您的提供商接收到属于当前接受的扇区的子扇区地址,提供商服务就会响应正确的图像。

但是,子扇区地址通过混淆序列算法重新映射。因此,同一扇区内的每个子扇区地址看起来都不相似。这样,不是所有浏览器都会接收到相同的令牌值或高度相似的令牌值。

假设您有16位扇区地址,每个扇区都有16位子扇区地址,组成32位令牌。这意味着您可以拥有65536个并发浏览器客户端,携带相同的令牌扇区,但没有两个令牌具有相同的低可预测性值。因此,您可以为每个会话ID分配一个令牌子扇区值。除非您的图像提供程序服务有超过65536个并发会话,否则不需要共享相同的子扇区令牌地址。通过这种方式,除非垃圾邮件发送者可以访问会话ID伪造设备/设施,否则您的图像提供程序将不会被垃圾邮件攻击,除非是拒绝服务攻击。
低可预测性意味着窥探者或偷窥者很难编造出一个可接受的令牌来垃圾邮件攻击您的图像提供程序服务。
当然,普通机器人无法通过 - 除非您真的冒犯了ANONYMOUS组,并且他们决定纯粹出于乐趣而垃圾邮件攻击您的服务器。即使如此,如果您在扇区地址堆栈和子扇区映射中引入了障碍,预测下一个令牌将非常困难。
顺便说一句,循环冗余匹配实际上是一种纠错技术,而不是加密技术。

哈哈,你在说什么啊?顺便提一下,我的英语很烂。 - DocWiki
5
哇。1)热链接防护的意义在于通过使其他用户无法使用来防止用户直接链接到您的资源。发送引用者标头的用户不是您的对手,链接到您的图像的人是您的对手,并且他们无法控制其他用户的浏览器。 2)我非常确定罗斯福和丘吉尔没有使用磁盘,因为磁盘是在二战结束30年后才发明的。 3)你说的是一次性密码,与手头的问题完全无关。 4)不要自己发明加密技术。绝不要。 - Nick Johnson
有人指出你在說“discs”時可能是指黑膠唱片,這是準確的。但對於本帖作者的問題來說,這仍然基本沒有關聯。 - Nick Johnson
这是在讽刺地说“不用担心热链接”吗? - JJ Geewax

0

简化版的极客文章,使用Google App Engine构建处理程序来获取和提供图像。您可以修改标题以指定png或其他格式,但是您正在从另一个位置返回图像。然后,您可以在处理程序中检查请求引用者信息,并在有人尝试访问该图像“热链接”时采取适当的措施。当然,因为您从未公开实际图像,所以无法进行热链接。


1
从第三方服务获取并返回图像,每次响应都这样做?当然,如果你喜欢高带宽账单,那就这么做吧。 - Nick Johnson
我提到了Google App Engine Blobstore,因为据我所知,除了通过应用程序部署存储静态图像外,那是我所知道的唯一存储图像的方式。我想你说得对,我没有特别提到Blobstore,因为那是他问题的一部分... - Ken
那么你其实并没有“从其他位置返回图片”,对吧?这让我认为你是在谈论从其他地方获取图像。 - Nick Johnson
我的意思是,当图像的URL是Blobstore URL时,您可以指定“examplewebsite.com/images/image1234.png”。对于小到中等网站直接提供图像,Google的带宽费用非常合理。 =) - Ken
好的,Blobstore 可以让你在任何想要的 URL 下提供图像 - 唯一的“blobstore URL”是上传 URL 和 get_serving_url。我同意 App Engine 的带宽费用是合理的 - 我更担心 OP 每个请求支付三倍的费用。 - Nick Johnson

0

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