我想创建一个包含许多图像的网站。但我希望避免直接访问图片,例如在不访问网站的情况下直接链接到图片。如何防止直接访问图像?
这样做的首选方法是什么?有哪些有利有弊的替代方案?
我有一些想法(我不知道他们是否是可能的):
- 文件权限
- PHP会议
- 临时文件名或URL
- HTTP重定向?
也许这不是在许多网站上实行?例如。我试图访问Facebook上的私人照片,但没有登录,但我仍然可以访问照片。
该平台可能是一个带有NginX和PHP的Ubuntu机器。
我想创建一个包含许多图像的网站。但我希望避免直接访问图片,例如在不访问网站的情况下直接链接到图片。如何防止直接访问图像?
这样做的首选方法是什么?有哪些有利有弊的替代方案?
我有一些想法(我不知道他们是否是可能的):
也许这不是在许多网站上实行?例如。我试图访问Facebook上的私人照片,但没有登录,但我仍然可以访问照片。
该平台可能是一个带有NginX和PHP的Ubuntu机器。
您img元素链接到PHP文件。这个文件检查用户是否拥有正确的权限,如果是的话,它可以发送一个img响应。
<img src="url/LoadImg.php?id=1337" alt="" />
仍然有人用权限的用户可以下载图片,并提供给其他人在其他地方(网站空间/邮件/不管)。为了使它更难以窃取它,你可以禁用右键单击图像,但仍然有一个知道一点关于http的用户应该没有任何问题来窃取它。 您可以在图像上放置一个签名(例如您的网站的徽标/名称),以便人们可以看到您的来源。这可以用php来完成。
如果你想成为讨人喜欢,你可以设置一个其他图像(色情是为这个伟大的:P),如果链接来自一个其他页面,发送:P
我一直在我的网站上使用这种方法,但是当页面上有很多照片时,显示页面的时间很长(每张照片都有访问检查和服务器请求...)。有没有人知道如何解决这个问题? – 2013-09-09 03:50:22
这里同样的问题。它加载速度非常慢,我无法使用Lazy。有没有其他方法? – desmeit 2016-11-23 08:16:18
这将是很难做到。为了让您的客户的网络浏览器访问图片,他们需要可读。文件权限不起作用,因为您需要授予对浏览器的访问权限。你将无法阻止某人下载并与他们一起做某事。
如果您只想停止直接链接,如果你改变定期的文件名和更新网页,以反映这一点,其他的网页都会有他们的链接断开。
改变文件名的好处,从来没有想过。确保它不会拒绝下载或访问至少一次(蛮力),但至少应该洗牌以消除恶意进程。 – TechNyquist 2017-11-14 09:08:48
这可能是有用的:Allow/deny image hotlinking with .htaccess
编辑:有一点要注意这个方法是,一些浏览器/ AV /防火墙软件删除Referer的数据,当您浏览,这将导致潜在的合法用户被视为hotlinkers 。
如果您的网站已经在使用某种形式的认证或会话系统,那么这将是更好地使用@马克Baijens的回答给出的方法。
更新:nginx的重写规则,以防止盗链:
你可以使用PHP脚本中使用类似检索图片:
<img src="mysite.com/getimage.php?id=001" />
,并有PHP脚本只有在确认HTTP_REFERER的域是你的域后才返回图像数据。
如果你有一个面向账户的网站,我建议像你说的那样使用PHP会话,并在返回图像数据之前让PHP脚本验证会话。
在您的站点文件夹添加一个简单的.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]
注意我还添加了js
和css
文件,即使我认为这是对的bizzare找人谁试图刮他们。
我使用两种方法 - 检查用户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);
?>
可以使用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的用户被启动。
我使用这种方法与我的整个成员区域,这是一个优秀的安全层。只要确保将日志放在成员文件夹外部的脚本中即可。
在您的账户中添加拒绝规则。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]
您可以访问Facebook上的“私人”照片,因为您使用的是直接图像链接,而不是照片页面。 – drudge 2010-10-21 17:48:16
@jnpcl:是的,这是我想在我的网站上预防的。问题是如何做到这一点? – Jonas 2010-10-21 17:49:57
你想阻止盗链或更多? http://stackoverflow.com/questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg 2010-10-21 17:56:08