我想创建一个包含许多图像的网站。但我想防止直接访问图像,例如直接链接到图像而不访问网站。
这样做的首选方法是什么?有哪些优点和缺点的替代方案?
我有一些想法(我不知道他们是否可能):
- 文件权限
- 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
在您的站点文件夹中添加一个简单.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
您可以使用 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 文件。
另请注意,我将用户 ID 放在 htaccess 文件中 ip 右侧的注释中。当用户注销时,您可以搜索 htaccess 文件并删除用户的 ip。
您可以在每个请求上更新此设置,以防止使用动态 ips 的用户被启动。
我在整个会员区都使用这种方法,这是一个极好的附加安全层。只需确保将登录脚本放在成员文件夹之外。
这可能很有用:Allow/deny image hotlinking with .htaccess
编辑:关于此方法需要注意的一点是,某些浏览器/AV/防火墙软件会在您浏览时删除引用者数据,这会导致潜在的合法用户被视为热链接者。
如果您的站点已经使用某种身份验证或会话系统,那么最好使用@Mark Baijens 回答中给出的方法。
更新:NGiNX 重写规则以防止盗链:
location ~* (\.jpg|\.png|\.css)$ {
valid_referers blocked mydomain.com www.mydomain.com;
if ($invalid_referer) {
return 444;
}
}
您可以使用 PHP 脚本来检索图像,例如:
<img src="mysite.com/getimage.php?id=001" />
并且只有在确认 HTTP_REFERER 的域是您的域后,才让 PHP 脚本返回图像数据。
如果您有一个面向帐户的网站,我建议您使用 PHP 会话,并让 PHP 脚本在返回图像数据之前验证会话。
我使用这两种方法 - 检查用户 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]
水印.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 中添加拒绝规则
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]
以上答案存在性能问题。我的解决方案是登录系统如下。
您可以每小时/每天重命名图像目录等。
images/2h4h4h4h4282hdj/182828.png
类似于
images/dhd777rhrje82883/182828.png
您可以这样做以完成系统或特定用户。
阿帕奇
httpd.conf
<Directory "/var/www/html/img">
AllowOverride None
order deny,allow
Options FollowSymLinks
</Directory>