如何防止直接访问图像?

时间:2010-10-21 17:44:20

标签: security image hotlinking access-protection

我想创建一个包含许多图片的网站。但我想防止直接访问图像,例如无需访问网站即可直接链接到图像。

这样做的首选方法是什么?有利有弊的替代方案是什么?

我有一些想法(我不知道它们是否可行):

  • 文件权限
  • PHP会话
  • 临时文件名或网址
  • HTTP重定向?

许多网站上可能没有这样做?例如。我试图访问Facebook上的私人照片而没有登录,但我仍然可以访问照片。

该平台可能是一台带有NginX和PHP的Ubuntu机器。

10 个答案:

答案 0 :(得分:19)

http://us3.php.net/image

您将img元素链接到php文件。此文件检查用户是否具有正确的权限,如果是,则可以发回img响应。

<img src="url/LoadImg.php?id=1337" alt="" />

仍然有权限的人可以下载图像并将其提供给其他人(网站空间/邮件/其他)。为了使它更难以窃取它你可以禁用右键单击图像,但仍然是一个知道一点关于http的用户应该没有任何问题来窃取它。 您可以在图像上放置签名(例如您的网站的徽标/名称),以便人们可以看到您在哪里来源。这可以用php完成。

如果你想变得有趣,你可以设置一个其他图像(色情很好用于此:P)如果链接来自其他页面则发送:P

答案 1 :(得分:7)

在您的站点文件夹中添加一个简单的.htaccess文件,其中包含以下行

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com$ [NC]
RewriteRule .*\.(wav|swf|jpg|jpeg|gif|png|bmp|js|css)$ - [F,NC,L]

注意我添加了jscss文件,即使我认为找到试图抓住他们的人也很奇怪。

答案 2 :(得分:6)

您可以使用htaccess和用户ip动态保护文件夹。

使用以下行将.htaccess文件添加到images文件夹中:

order deny,allow
deny from all

然后使用PHP将用户ip插入到htaccess文件中,当他们登录时如下:

<?
$ip = $_SERVER['REMOTE_ADDR'];
if (!filter_var($ip, FILTER_VALIDATE_IP)) exit();
$file = $_SERVER["DOCUMENT_ROOT"].'/YOUR_IMAGE_FOLDER/.htaccess';
$current = file_get_contents($file);
$current .= "allow from ".$_SERVER['REMOTE_ADDR']." #".$_SESSION['id']."\n";
file_put_contents($file, $current);
?>

该文件夹将被阻止任何未登录的IP。

请注意,我检查了ip是否有效。重要的是,您不能让用户将自己的代码注入htaccess文件。

另请注意,我将用户ID放在htaccess文件中ip右侧的注释中。当用户注销时,您可以搜索htaccess文件并删除用户的IP。

您可以对每个请求进行更新,以防止使用动态ips的用户被启动。

我将这个方法用于我的整个成员区域,这是一个很好的附加安全层。只需确保将日志放在members文件夹之外的脚本中。

答案 3 :(得分:3)

这可能很有用:Allow/deny image hotlinking with .htaccess

编辑:关于这种方法需要注意的一点是,某些浏览器/ AV /防火墙软件会在您浏览时删除Referer数据,这会导致可能合法的用户被视为hotlinkers。

如果您的网站已经使用某种身份验证或会话系统,那么最好使用@Mark Ba​​ijens答案中给出的方法。

更新:NGiNX重写规则以防止热链接:

location ~* (\.jpg|\.png|\.css)$ {
    valid_referers blocked mydomain.com www.mydomain.com;
    if ($invalid_referer) {
        return 444;
    }
}

答案 4 :(得分:2)

您可以使用PHP脚本使用以下内容检索图像:

<img src="mysite.com/getimage.php?id=001" />

并且只有在确认HTTP_REFERER的域名是您的域之后才让PHP脚本返回图像数据。

如果您有一个面向帐户的网站,我建议您按照规定使用PHP会话,并让PHP脚本在返回图像数据之前验证会话。

答案 5 :(得分:2)

我使用两种方法 - 检查用户gent和referrer。用户代理我在.htaccess查看。并且引用者检查php文件。您可以在http://coloring-4kids.com

看到它

这是我的代码:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com$ [NC]

RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-image [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-news [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-video [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-mobile [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners-google [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners [NC]
# RewriteCond %{HTTP_USER_AGENT} !adsbot-google [NC]
RewriteCond %{HTTP_USER_AGENT} !bingbot [NC]
RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit [NC]
RewriteCond %{HTTP_USER_AGENT} !baiduspider [NC]
RewriteCond %{HTTP_USER_AGENT} !yandex [NC]
RewriteCond %{HTTP_USER_AGENT} !sogou [NC]
RewriteCond %{HTTP_USER_AGENT} !twitterbot [NC]
RewriteCond %{HTTP_USER_AGENT} !pinterest [NC]


RewriteRule (^.*\.(gif)$) /watermark.php?src=$1 [L]

watermark.php

<?php  

$test = getenv("HTTP_REFERER");
$proverka =  substr($test, 0, 25);

 header('content-type: image/jpeg');

 $image = imagecreatefromgif($_GET['src']);

 $watermark = imagecreatefromgif('watermark.gif');

 $watermark_width = imagesx($watermark);
 $watermark_height = imagesy($watermark);


 $dest_x = imagesx($image) - $watermark_width;
 $dest_y = imagesy($image) - $watermark_height;



if (strpos($proverka, 'media') !== false)
   { $pinproverka=true; }

 if (($proverka != 'http://coloring-4kids.com') && (imagesx($image) > 400) && ($pinproverka!=true) )  { imagecopymerge($image, $watermark, $dest_x - 5, 5, 0, 0, $watermark_width, $watermark_height, 100); }



 imagegif($image);

 imagedestroy($image);
 imagedestroy($watermark);

?>

答案 6 :(得分:1)

这很难做到。为了让客户的Web浏览器能够访问图片,它们需要具有可读性。文件权限不起作用,因为您需要授予对浏览器的访问权限。您将无法阻止某人下载并使用它们做某事。

如果您只想停止直接关联,如果您定期更改文件名并更新您的网页以反映这一点,则其他网页的链接会被破坏。

答案 7 :(得分:0)

在.htaccess中添加拒绝规则

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd.*$ [NC] 
RewriteRule \.(gif|jpg|js|txt)$ /messageforcurious [L]

答案 8 :(得分:0)

上述答案中存在性能问题。 我的解决方案是登录系统如下。

您可以每小时/每天等重命名图像目录。

images/2h4h4h4h4282hdj/182828.pngimages/dhd777rhrje82883/182828.png

您可以执行此操作以完成系统或特定用户的操作。

答案 9 :(得分:0)

阿帕奇

httpd.conf

<Directory "/var/www/html/img">
    AllowOverride None
    order deny,allow
    Options FollowSymLinks
</Directory>