Apache 2:防止服务器范围内的图像热链接

Apache 2:防止服务器范围内的图像热链接

如果图像链接自某些常见的“坏人”,即那些倾向于使用其他人带宽的用户网站,我会尝试阻止对我服务器上图像的访问:

  • livejounal.com
  • 博客网
  • myspace.com
  • ...

我的问题与其他问题有两点不同,例如这个问题那个问题

  • 我想在“服务器范围”进行配置,即在 apache.conf 中为所有主机/域进行配置,而不是在 .htaccess 或单个虚拟主机中进行配置
  • 我想将请求重定向到我选择的图像,而不仅仅是发送 403 FORBIDDEN

我尝试在 apache.conf 中包含 RewriteRules,但它什么也没做。而且似乎没有允许我根据 SetEnv 进行重定向的选项。

有什么建议么?

答案1

我有一个解决方案,即使它不是很漂亮,因为即使图像没有被热链接,它也会导致默认错误 403 文档发生变化:

这进入apache2.conf:

    SetEnvIfNoCase Referer "livejournal.com" hotlink

    <FilesMatch ".(gif|jpg|jpeg|png)$">
            ErrorDocument 403 /server404/no_hotlink.php
    </FilesMatch>
    <FilesMatch ".(gif|jpg|jpeg|png|mpg|avi|flv)$">
            deny from env=hotlink
    </FilesMatch>

    Alias /server404 "/var/www/_404"
    <Directory "/var/www/_404">
        AllowOverride AuthConfig
        Order allow,deny
        Allow from all
    </Directory>

一段时间以来,我们一直使用 /server404 路径来记录全服务器的 404 错误文档,因此我们已经有了它。您也可以将其命名为 403 或 GlobalNoHotlink 或任何您想要的名称。

对于图像(第一个 FilesMatch),我们将“禁止”的 ErrorDocument 设置为 /server404 目录中的 PHP 文件。然后我们检查它是否被热链接(我们对视频文件也这样做,因此有两个 FilesMatch 标签),如果被热链接,则禁止访问。

这进入/var/www/_404/no_hotlink.php - 禁止图像时调用的 PHP 文件:

    <?PHP
    $file = dirname(__FILE__) . '/_default/no_hotlink.png';

    header('HTTP/1.1 200 OK', true, 200);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    header('Content-length: ' . filesize($file));
    header('Content-type: image/png');
    readfile($file);
    ?>
  • 第一行用于标识我们要发送的图像文件。
  • 然后我们将 HTTP 标头设置为 200(这是可选的。自行决定),
  • 添加一些标题以避免缓存图像(如果有人决定访问我们的网站,我们不想让那个 8000x8000 的粉红色像素文件“从缓存”出现在我们的网站上,对吗?)。
  • 根据虚拟文件的大小确定内容长度,并
  • MIME 类型(您可能必须更改后者而不使用 PNG)。
  • 然后我们读取文件。

它确实有效 - 但它并不像我希望的那么漂亮,所以我仍然对其他解决方案感到高兴。

答案2

我的 httpd.conf 中有类似这样的内容:

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "%{HTTP_REFERER}" "!^http://www.mydomain.com/.*$" [NC]
RewriteRule "\.(jpg|png)$ - [F]

如果你以前没有使用过 RewriteConds 和 RewriteRules,那么你可能也需要使用它:

RewriteEngine On

我在 Google 上或 Apache Cookbook 上找到了它。现在记不清了。

答案3

唯一有效的方法是使用 mod 重写规则。如果引用者不是来自您自己的域,则将图像 URL 重写为不存在的 URL、其他地方的 URL 或 1px x 1px 的透明 gif。

许多人会用一张写着“不要吸血,伙计”或类似字样的图片来做这件事

答案4

referer 检查并不总是有效,一些代理甚至浏览器会从 http 请求中删除 HTTP_REFERER 标头。

最好在内容生成代码中检查某些 cookie [例如生成图片库的 index.php],并在 mod-rewrite 或 apache2 级别检查 cookie 是否设置为预期值。

这里或者这里

相关内容