我想创建一个包含许多图片的网站。但我想防止直接访问图像,例如无需访问网站即可直接链接到图像。
这样做的首选方法是什么?有利有弊的替代方案是什么?
我有一些想法(我不知道它们是否可行):
许多网站上可能没有这样做?例如。我试图访问Facebook上的私人照片而没有登录,但我仍然可以访问照片。
该平台可能是一台带有NginX和PHP的Ubuntu机器。
答案 0 :(得分:19)
您将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]
注意我添加了js
和css
文件,即使我认为找到试图抓住他们的人也很奇怪。
答案 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 Baijens答案中给出的方法。
更新: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.png
像
images/dhd777rhrje82883/182828.png
您可以执行此操作以完成系统或特定用户的操作。
答案 9 :(得分:0)
阿帕奇
httpd.conf
<Directory "/var/www/html/img">
AllowOverride None
order deny,allow
Options FollowSymLinks
</Directory>