代码之家  ›  专栏  ›  技术社区  ›  Jonas

如何防止直接访问图像?

  •  17
  • Jonas  · 技术社区  · 14 年前

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

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

    • 文件权限
    • PHP会话
    • 临时文件名或url

    也许这在很多网站上都没有实践过?E、 我试着在没有beeing登录的情况下访问Facebook上的一张私人照片,但我仍然可以访问这张照片。

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

    8 回复  |  直到 14 年前
        1
  •  22
  •   Mark Baijens    14 年前

    http://us3.php.net/image

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

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

    不过,有权限的人仍然可以下载图像并将其提供给其他人(webspace/mail/whatever)。为了让它更难窃取,您可以禁用右键单击图像,但仍然是一个对http稍有了解的用户不应该有任何问题来窃取它。

    如果你想变得有趣,你可以设置一个其他的图片(色情很适合这个:P),如果链接来自另一个页面,就会发送这个图片:P

        2
  •  9
  •   Kalle Richter    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 即使我觉得找个想刮的人也很奇怪。

        3
  •  6
  •   Matthew    10 年前

    使用以下行将.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是否有效。重要的是,您不能让用户将自己的代码注入htaccess文件。

    还要注意,我将用户id放在htaccess文件中ip右侧的注释中。当用户注销时,您可以搜索htaccess文件并删除该用户的ip。

    您可以在每次请求时更新此内容,以防止使用动态IP的用户被启动。

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

        4
  •  3
  •   Community CDub    8 年前

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

    编辑:这个方法需要注意的一点是,某些浏览器/AV/Firewall软件在您浏览时删除Referer数据,这将导致潜在的合法用户被视为hotlinkers。

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

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

    location ~* (\.jpg|\.png|\.css)$ {
        valid_referers blocked mydomain.com www.mydomain.com;
        if ($invalid_referer) {
            return 444;
        }
    }
    
        5
  •  2
  •   Evan Mulawski    14 年前

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

    <img src="mysite.com/getimage.php?id=001" />

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

        6
  •  2
  •   janejoung    11 年前

    我使用两种方法-检查用户代理和引用。我在.htaccess检查的用户代理。并在php文件中检查referer。你可以在 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
  •  1
  •   Steve Rowe    14 年前

    这很难做到。为了让客户的web浏览器访问图片,它们必须是可读的。文件权限将不起作用,因为您需要授予对浏览器的访问权限。你无法阻止别人下载它们并对它们做些什么。

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

        8
  •  0
  •   Ketan Borada    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
  •  0
  •   Dum    5 年前

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

    images/2h4h4h4h4282hdj/182828.png 有点像 images/dhd777rhrje82883/182828.png

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