2

在我去指责某人之前,我需要确认一些事情......好吧,我宁愿不说。

问题:

我们允许用户上传图片并将其嵌入我们网站的文本中。过去我们也允许用户热链接到我们的图像,但由于服务器负载,我们不得不停止这种做法。

当前的“解决方案”:

程序员用来解决我们“连接太多”问题的方法是将接收和处理图像请求的文件(image_request.php)重命名为image_request2.php,并将原来的内容替换为

<?php
header("HTTP/1.1 500 Internal Server Error") ;
?>

显然,这导致所有 src 属性指向原始 image_request.php 的图像都被破坏,并且在这种情况下也是要发送的错误代码。

建议的解决方案:

我觉得更优雅的解决方案是:

在 .htaccess

  1. 如果请求是针对 image_request.php
  2. 检查推荐人
  3. 如果推荐人不是我们的网站,请发送适当的标题
  4. 如果referrer是我们的站点,继续image_request.php并处理图像请求

我想知道的是:

与对 image_request.php 的每个请求简单地返回 500 相比:

如果我们使用上面列出的我提出的替代解决方案,将会产生多少负载?

有一个更好的方法吗?

我们主要关心的是该网站是否正常运行。我不愿意同意打破所有内部链接的图像是解决这个问题的最佳/唯一方法。我拒绝告诉我们的用户,由于我们更改了某些内容,他们现在必须手动更改之前上传的所有内容中的嵌入代码。

4

4 回答 4

2

好的,那么您可以使用 Apache 的 mod_rewrite 功能来防止热链接:

http://www.cyberciti.biz/faq/apache-mod_rewrite-hot-linking-images-leeching-howto/

于 2010-05-24T11:37:40.147 回答
1

与运行 PHP 脚本相比,使用 ModRwrite 可能会给您带来更少的负载。我认为您的解决方案会更轻松。

确保仅在引用标头不为空时才在步骤 3 中阻止访问。某些浏览器和防火墙会完全阻止引用标头,而您不想阻止它们。

于 2010-05-24T06:24:13.513 回答
1

我假设您将图像路径存储在带有图像 ID 的数据库中,对吗?然后您查询数据库以获取图像路径,并为其提供图像 ID。

我建议您将 MemCached 安装到服务器并缓存用户请求。在 PHP 中很容易做到。之后,您将看到服务器负载并决定是否应该停止此热链接。

于 2010-05-24T08:31:53.820 回答
1

您增加的负载等于 PHP (zilch) 中的字符串比较。

混淆解决方案甚至不能从一开始就解决问题,因为它不会阻止将来发生盗链。如果您确实检查了引荐来源标头,请绝对确定所有主流主流浏览器都会按照您的预期设置标头。它是一个可选的标头,对于嵌入在 HTML 文档中的图像,其行为可能因浏览器而异。

您可能为所有请求启用了会话(无论它们是否经过身份验证) - 作为备用计划,您还可以将会话 cookie 名称重命名为模糊的名称(编辑:这里的模糊实际上并不重要,只要 cookie仅为您的主机设置(并且确实如此))并检查是否在 image_request.php 中设置了该名称的 cookie(没有设置 cookie 将表明它是对您站点的第一个请求)。仅将其用作后备或冗余检查。这比检查推荐人更糟糕。

如果您是从 markdown 或其他东西动态生成 IMG HTML,您可以使用私钥散列策略,并在查询字符串上附加一个短暂的过期时间。完全不透气,但对于你正在做的事情来说,它似乎太过分了。

此外,没有“适当的标头”可以向客户谎报资源的可用性;)只需发送 404。

于 2010-05-24T10:00:57.683 回答