Security 如何防止直接访问图像?

Security 如何防止直接访问图像?,security,image,hotlinking,access-protection,Security,Image,Hotlinking,Access Protection,我想创建一个有很多图片的网站。但我希望防止直接访问图像,例如,不访问网站就直接链接到图像 这样做的首选方式是什么?有哪些利弊的替代方案 我有一些想法(我不知道是否可行): 文件权限 PHP会话 临时文件名或URL HTTP重定向 也许很多网站都不这么做?例如,我试图在没有登录的情况下访问Facebook上的私人照片,但我仍然可以访问该照片 该平台可能是一台带有NginX和PHP的Ubuntu机器。 将img元素链接到一个php文件。此文件检查用户是否具有正确的权限,如果是,则可以发回img响

我想创建一个有很多图片的网站。但我希望防止直接访问图像,例如,不访问网站就直接链接到图像

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

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

  • 文件权限
  • PHP会话
  • 临时文件名或URL
  • HTTP重定向
也许很多网站都不这么做?例如,我试图在没有登录的情况下访问Facebook上的私人照片,但我仍然可以访问该照片

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

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

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

不过,有权限的人可以下载图片并将其提供给其他地方的其他人(Web空间/邮件/任何东西)。为了让窃取变得更困难,您可以禁用对图像的右键单击,但是对http稍有了解的用户在窃取图像时应该不会遇到任何问题。 您可以在图像上放置签名(例如,您网站的徽标/名称),以便人们可以看到您的来源。这也可以通过php实现


如果你想变得有趣,你可以设置另一个图像,如果链接来自另一个页面,则发送该图像:p

这将很难做到。为了让客户端的web浏览器能够访问这些图片,它们必须是可读的。文件权限无效,因为您需要授予对浏览器的访问权限。你将无法阻止某人下载它们并对其进行操作

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

这可能很有用:

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

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

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

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

您可以使用PHP脚本检索图像,方法如下:

只有在确认HTTP_REFERER的域是您的域之后,PHP脚本才能返回图像数据


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

在站点文件夹中添加一个简单的
.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检查的用户代理。并在php文件中检查引用者。你可以在

这是我的密码:

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文件添加到图像文件夹:
订单拒绝,允许

全部拒绝
在.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/2H4H4282HDJ/182828.png
差不多
images/dhd777rhrje82883/182828.png


您可以这样做来完成系统或特定用户。

您可以访问Facebook上的“私人”照片,因为您使用的是直接图像链接,而不是照片页面。@jnpcl:是的,这是我想在我的网站上阻止的。问题是如何做到这一点?你是在试图阻止热链接还是其他什么@格雷格:是的,但我不能用那种方法,因为我使用的是Nginx,而且我没有
.htaccess
文件。你想阻止什么?只是热链接,还是您想要基于用户/成员身份的访问权限?谢谢,但是我不能使用这种方法,因为我使用NingX作为Web服务器,并且没有任何
.htaccess
文件。通过一些调整,它是。谢谢,我将研究该解决方案。这些程序不仅删除了推荐人,它们有时用一些常量字符串替换它。所以你可能需要一个更长的有效推荐人白名单。@乔纳斯:你的网站管理员不允许你添加.htaccess文件?!改变网络主持人!我一直在我的网站上使用这种方法,但是当页面上有很多照片时,显示页面的时间非常长(每张照片都有一个访问检查和一个服务器请求…)。有人知道可以做些什么来缓解这个问题吗?这里也有同样的问题。它的负载非常慢,我不能和懒惰的人一起工作。还有其他方法吗?使用Nginx,有效的参考者*.yourdomain.com yourdomain.com;如果($invalid_referer){return403;}更改文件名是一个很好的方法,那就不要考虑这个问题。当然,它不会拒绝下载或访问至少一次(蛮力),但至少会洗牌擦除恶意进程。这是一个多么漂亮的答案。CheersHow您是否删除了htaccess中旁边有评论的行?如果有更多详细信息(或链接)来解释“HTTP\U引用者的域”,那就太好了。