4

在我们的网站中,我们正在做一个图像保护部分。因此,作为图像保护的一部分,我们需要为图像提供防盗链。在我们的网站中,我们使用生成的 url 显示图像。

例如,在我们的网站中,图像源如下:image_file.php?type=image&w=10&h=10&i=12

(这只是一个假网址,例如)。

所以使用这个url我们需要在我们的网站上显示图片,同时又想防止它被热链接,有什么办法可以防止热链接吗?

4

6 回答 6

8

如果您可以使用 .htaccess 方法,那就太好了,另外,正如我在评论中所说,100% 万无一失的方法是使用 base64 编码。显示图像时,可以使用以下代码将它们转换为 base64:

<?php
$imagedata = file_get_contents("/path/to/image.png");
$base64 = base64_encode($imagedata);
?>
<img src="data:image/jpeg;base64,<?= $base64; ?>" />

此外,如果您想获得真正的创意,您可以通过使用您的 .htaccess 文件显示替代图像来“RAT”热链接“小偷”...这样做:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ http://www.mydomain.com/dontstealmystuff.png [R,L]

只需确保 dontstealmystuff.png 在服务器上可用

于 2012-08-10T04:59:01.087 回答
3

基本的 .htaccess 示例

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

上面允许一个空白的REFERER(像我一样)。

这不会:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

您可以找到很多变体,可能需要尝试一下才能找到最适合您的变体。

于 2012-08-10T04:47:10.670 回答
3

图片盗链通常由referer检测到,但在以下情况下不起作用:

  • 用户在他的浏览器中关闭了推荐人发送(出于隐私目的,我有这个)
  • 页面通过 HTTPS 查看(浏览器不应发送引用数据)。

您将阻止实际用户查看图像。

在处理这个问题时考虑使用会话/cookies。然后,您必须通过 php 脚本传递每个图像。

于 2012-08-10T06:51:37.187 回答
2

一般来说,执行此操作的正确方法是使用 .htaccess 文件之类的命令,例如:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?somesite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ http://i.imgur.com/aNbhd.jpg [L]

但是,在 PHP 中执行此操作基本相同。您所做的只是验证 $_SERVER['HTTP_REFERER'] 是否以页面的 URL 开头。然而,有可能欺骗 HTTP_REFERER,所以它不会是 100%。然而,用户必须这样做(一个漂亮的外部网站(主要是......)很多都不能欺骗这个),所以它会阻止其他网站嵌入您的图像,而不会将您的网站放置在 iframe 或其他一些 hoopla 中。

另一种方法,可能是最安全的,尽管它在服务器上最难,是使用 $_SESSION 变量传递一个令牌/标志,然后检查令牌。

session_start();
$_SESSION["allow_images"] = true;

然后在为他们获取图像的 PHP 页面上:

if($_SESSION["allow_images"])
{ 
     //Send some pics! 
}

但是,这仅适用于用户最近访问您的站点的时间不足以使他们自己的会话仍然处于活动状态。

于 2012-08-10T04:52:03.897 回答
0

您可以尝试$_SERVER['HTTP_REFERER']根据已知值检查 的值,但正如文档所述,这可能会被欺骗。不过,这可能有助于应对常见情况。

于 2012-08-10T04:42:55.890 回答
0

在 image_file.php 中使用 http_referer。

$ref = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER']: "";
if ($ref != "" && strpos($ref,'http://www.yourdomain.com/')===0)
{
   //the request for this image is coming from some other domain, so take appropriate action
}
else
{
  //do whatever logic you are currently using to show the images
}

在这里找到一个完整的解决方案:http: //safalra.com/programming/php/prevent-hotlinking/

于 2012-08-10T04:45:47.447 回答