【问题标题】:How to protect against direct access to images? [closed]如何防止直接访问图像?
【发布时间】:2011-04-28 18:25:27
【问题描述】:

我想创建一个包含许多图像的网站。但我想防止直接访问图像,例如无需访问网站即可直接链接到图片。

执行此操作的首选方法是什么?有哪些优点和缺点的替代方案?

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

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

也许很多网站都没有这种做法?例如。我尝试在未登录的情况下访问 Facebook 上的私人照片,但我仍然可以访问该照片。

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

【问题讨论】:

  • 您可以访问 Facebook 上的“私人”照片,因为您使用的是直接图片链接,而不是照片页面。
  • @jnpcl:是的,这就是我想在我的网站上阻止的。问题是怎么做?
  • 您是要防止盗链,还是其他? stackoverflow.com/questions/1245869/…
  • @Greg:是的,但是我不能使用那个方法,因为我使用的是 Nginx,而且我没有.htaccess 文件。
  • 你想阻止什么?只是盗链,还是您想要基于用户/会员的访问权限?

标签: security image hotlinking access-protection


【解决方案1】:

http://us3.php.net/image

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

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

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

如果你想变得有趣,你可以设置一个在链接来自其他页面时发送的其他图像:P

【讨论】:

  • 我一直在我的网站上使用这种方法,但是当页面上有很多照片时,显示页面的时间真的很长(每张照片都完成了访问检查和服务器请求.. .)。有没有人知道可以做些什么来缓解这个问题?
  • 这里有同样的问题。它加载非常慢,我无法使用 Lazy。还有其他方法吗?
  • 使用 Nginx,valid_referers *.yourdomain.com yourdomain.com; if ($invalid_referer){ 返回 403; }
【解决方案2】:

在您的站点文件夹中添加一个简单的.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]

请注意,我还添加了 jscss 文件,即使我认为找到试图抓取它们的人很奇怪。

【讨论】:

  • 此代码是否会阻止对css, js, txt and image files的直接访问和跨网站访问?只有我的网站可以使用我的资产,而不能使用其他?这会给他们403 error 吗?
  • @shanmugapradeep 是的,是的,是的。但是,您应该注意 HTTP Referer 是不可靠的。通过阻止空的 Referer 标头(即“直接访问”),您可能还阻止合法用户,因为现在越来越多的用户(和浏览器)选择完全禁止 Referer 标头为了用户隐私。
  • @MrWhite 那么我们如何才能只阻止跨域链接到我们的资产以保护资产和服务器资源
【解决方案3】:

您可以使用 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。

您可以针对每个请求进行更新,以防止使用动态 ip 的用户被踢出。

我在我的整个会员区都使用这种方法,这是一个极好的附加安全层。只需确保将登录脚本放在成员文件夹之外。

【讨论】:

  • 多么美丽的答案。干杯
  • 如何从 htaccess 中删除旁边有注释的行?
【解决方案4】:

您可以使用 PHP 脚本来检索图像,例如:

&lt;img src="mysite.com/getimage.php?id=001" /&gt;

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

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

【讨论】:

  • 如果有更多详细信息(或链接)解释“HTTP_REFERER 的域”,那就太好了。
【解决方案5】:

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

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

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

更新:NGiNX 重写规则以防止盗链:

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

【讨论】:

  • 谢谢,但是我无法使用该方法,因为我使用 NingX 作为网络服务器并且没有任何 .htaccess 文件。
  • 经过一些调整,它是possible
  • 谢谢,我会看看那个解决方案。
  • 这些程序不仅会删除引荐来源网址,有时还会将其替换为一些常量字符串。因此,您可能需要更长的有效推荐人白名单。
  • @Jonas:您的虚拟主机不允许您添加 .htaccess 文件?!更换主机!
【解决方案6】:

我使用这两种方法 - 检查用户 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);

?>

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

    • 好点改变文件名,从来没想过。当然它不会拒绝下载或访问至少一次(蛮力),但至少会洗牌抹去恶意进程。
    【解决方案8】:

    在您的 .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]
    

    【讨论】:

      【解决方案9】:

      以上答案存在性能问题。 我的解决方案是登录系统如下。

      您可以每小时/每天等重命名图像目录。

      images/2h4h4h4h4282hdj/182828.png 类似于 images/dhd777rhrje82883/182828.png

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

      【讨论】:

        【解决方案10】:

        阿帕奇

        httpd.conf

        <Directory "/var/www/html/img">
            AllowOverride None
            order deny,allow
            Options FollowSymLinks
        </Directory>
        

        【讨论】:

        • AllowOverride None 命令拒绝,允许选项 FollowSymLinks
        猜你喜欢
        • 1970-01-01
        • 2011-10-16
        • 2016-06-28
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多