2010-10-21 115 views
14

我想创建一个包含许多图像的网站。但我希望避免直接访问图片,例如在不访问网站的情况下直接链接到图片。如何防止直接访问图像?

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

我有一些想法(我不知道他们是否是可能的):

  • 文件权限
  • PHP会议
  • 临时文件名或URL
  • HTTP重定向?

也许这不是在许多网站上实行?例如。我试图访问Facebook上的私人照片,但没有登录,但我仍然可以访问照片。

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

+0

您可以访问Facebook上的“私人”照片,因为您使用的是直接图像链接,而不是照片页面。 – drudge 2010-10-21 17:48:16

+0

@jnpcl:是的,这是我想在我的网站上预防的。问题是如何做到这一点? – Jonas 2010-10-21 17:49:57

+0

你想阻止盗链或更多? http://stackoverflow.com/questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg 2010-10-21 17:56:08

回答

20

http://us3.php.net/image

您img元素链接到PHP文件。这个文件检查用户是否拥有正确的权限,如果是的话,它可以发送一个img响应。

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

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

如果你想成为讨人喜欢,你可以设置一个其他图像(色情是为这个伟大的:P),如果链接来自一个其他页面,发送:P

+3

我一直在我的网站上使用这种方法,但是当页面上有很多照片时,显示页面的时间很长(每张照片都有访问检查和服务器请求...)。有没有人知道如何解决这个问题? – 2013-09-09 03:50:22

+0

这里同样的问题。它加载速度非常慢,我无法使用Lazy。有没有其他方法? – desmeit 2016-11-23 08:16:18

1

这将是很难做到。为了让您的客户的网络浏览器访问图片,他们需要可读。文件权限不起作用,因为您需要授予对浏览器的访问权限。你将无法阻止某人下载并与他们一起做某事。

如果您只想停止直接链接,如果你改变定期的文件名和更新网页,以反映这一点,其他的网页都会有他们的链接断开。

+0

改变文件名的好处,从来没有想过。确保它不会拒绝下载或访问至少一次(蛮力),但至少应该洗牌以消除恶意进程。 – TechNyquist 2017-11-14 09:08:48

3

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

编辑:有一点要注意这个方法是,一些浏览器/ AV /防火墙软件删除Referer的数据,当您浏览,这将导致潜在的合法用户被视为hotlinkers 。

如果您的网站已经在使用某种形式的认证或会话系统,那么这将是更好地使用@马克Baijens的回答给出的方法。

更新:nginx的重写规则,以防止盗链:

+0

谢谢,但是我不能使用这种方法,因为我使用NingX作为web服务器,并且没有任何'.htaccess'文件。 – Jonas 2010-10-21 18:02:57

+0

随着一些调整,它[可能](http://wiki.nginx.org/NginxHttpRewriteModule)。 – drudge 2010-10-21 18:05:52

+0

谢谢,我会看看这个解决方案。 – Jonas 2010-10-21 18:18:32

2

你可以使用PHP脚本中使用类似检索图片:

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

,并有PHP脚本只有在确认HTTP_REFERER的域是你的域后才返回图像数据。

如果你有一个面向账户的网站,我建议像你说的那样使用PHP会话,并在返回图像数据之前让PHP脚本验证会话。

4

在您的站点文件夹添加一个简单的.htacess文件与follwoing线

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文件,即使我认为这是对的bizzare找人谁试图刮他们。

2

我使用两种方法 - 检查用户gent和引用。用户代理我在.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); 

?> 
4

可以使用htaccess以及用户的IP动态保护的文件夹。

到你的图片文件夹添加.htaccess文件与以下行:

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文件中非常重要。

另请注意,我将用户标识置于htaccess文件中ip右侧的注释中。当用户注销时,您可以搜索htaccess文件并删除该用户的IP。

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

我使用这种方法与我的整个成员区域,这是一个优秀的安全层。只要确保将日志放在成员文件夹外部的脚本中即可。

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]