如何防止网站上资源的热链接(“图像盗窃” /“带宽盗窃”)?


8

我正在尝试编写“最终”反热链接.htaccess ...

您可以在网上找到许多示例/教程 / 生成器,但其中许多是错误的或不完整的(或两者都是)。

这些是我要寻找的功能:

  • 当HTTP_REFERER是外部站点时,必须阻止热链接以获取文件扩展名列表。
  • 必须允许对当前域(duh)进行热链接,而不必在.htaccess中对其进行编码。
    • 对于当前域,它必须在http和https下运行。
    • 对于当前域,它必须与www一起使用,而不能与www一起使用。
  • 必须能够将例外域添加到这些规则中(例如我们的朋友Google),并且这些域必须在http和https下以及带有www或不带有www的情况下工作。

到目前为止,这是我实现的目标:

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

我的问题:

  1. 如何避免mydomain.com在.htaccess中进行硬编码?(能够将这个.htaccess部署到我所有的域中而不必为每个域都进行修改,那就太好了。)
  2. 在我的RewriteRule中,gif|jpe?g|png|zipx?等效gif|jpg|jpeg|png|zip|zipx吗?(对不起,正则表达式仍然很新。)
  3. 您是否发现我不知道的.htaccess中有什么不好的东西?

对于#1,我知道这是有可能的。我找到的最接近的代码段是从URL中删除www而不对域进行硬编码的代码段。有没有办法对我的问题1使用此方法?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

更新:

我知道可以使用带水印图像而不是常规图像的解决方案。但是我不是在寻找这种解决方案。我想要一个通用解决方案(服务403错误),适用于所有类型的二进制文件(zip,exe,iso,jpg,png,gif ...)。


恕我直言,Apache应该至少随附此配置文件作为添加的选项。我想知道是否有任何Apache开发人员愿意添加它?
克里斯·纳瓦


@Tom O'Connor有趣的读物,我同意。但是我的脚本将用于大型二进制文件(例如zip,exe ...),而不用于图像等。所以我仍然需要得到答案。是的,带宽很便宜,但是500 MB的zip和100 KB的jpg不一样...
AlexV 2011年

我没有回避答案。我只是在bit人;)
汤姆·奥康纳

Answers:


9

无论您做什么,都将“浪费” CPU周期(要确定引用站点(进行链接的站点)是否已被授权,您必须对请求数据进行一些处理)。
您唯一可以做的就是节省带宽,同时浪费最少的CPU周期。

Apache Docs中有一些示例可以完全满足您的要求。这个:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

似乎是最适用的(并且不需要mod_rewrite的全部重量)。
您可以使用其他SetEnvIfAllow指令添加其他有效的引荐来源网址。


不错,但是我需要一个不对htaccess中的域名进行硬编码的解决方案(请仔细阅读我的问题)。
AlexV 2011年

然后,您需要一个像Oliver建议的编程解决方案(仍然需要您对允许的引荐来源网址的列表,正则表达式或其他表示进行硬编码-它只允许您将其放入离散文件中)
voretaq7 2011年

不一定,如果您查看我的第二个代码块,您可以看到它可以完成...我只需要对其进行调整即可...
AlexV 2011年

您可以在第二个代码块中使用清理逻辑(或类似的魔术,仅%{HTTP_HOST}用于较少的正则表达式解析)将URL的主机插入规则集,这应该为您提供动态的本地域(进行了广泛测试),但您仍然需要努力编码“不错”的外部引荐来源网址,例如Google(通过引荐来源网址,用户代理,IP等)
voretaq7 2011年

3

如何编写这样的规则:如果引用者未知(禁止访问),则仅调用一个Php文件,在该文件中将图像作为参数传递,并在Php文件中将红色标记为大写:“此文件来自MYWEBSITE.COM并且没有要在此处显示的官方授权”。

关于您的问题,使您的规则全球化。如果我错了,请更正我,但是如果任何虚拟主机之前声明了该规则,则该规则将应用于所有虚拟主机(类似于“默认规则”)。

另一个想法很简单:只要重定向到一个Php文件(在此处filter.php),它将在授权的网站中查找并在一切正常的情况下返回所需的文件:

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

filter.php动态加载虚拟主机列表或类似的东西时:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}

这是可能的,但是我不想(通过使用PHP)为此浪费CPU。我只想为403服务。同样,对于PHP,您必须管理所有缓存问题,这可能非常复杂。
AlexV 2011年


0

问题1:

RewriteEngine On
RewriteCond%{HTTP_REFERER}!^ http://(。+)?yoursite.com/ [NC]
RewriteCond%{HTTP_REFERER}!^ $
RewriteRule。*。(jpe?g | gif | bmp | png)$- [F]

问题2:

问题3

我会用我的一个


对于问题1,“ yoursite.com”经过硬编码,因此没有帮助。
AlexV

@AlexV:不是。只需将yoursite.com替换为您想允许的地址,其他推荐人将无法下载任何图像
起源

以及我如何不对自己进行硬编码呢?
AlexV

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.