26

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

这样做的首选方法是什么?有哪些优点和缺点的替代方案?

我有一些想法(我不知道他们是否可能):

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

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

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

4

10 回答 10

24

http://us3.php.net/image

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

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

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

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

于 2010-10-21T17:52:04.900 回答
16

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

于 2012-12-01T12:38:12.153 回答
10

您可以使用 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 的用户被启动。

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

于 2014-09-16T21:02:41.203 回答
3

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

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

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

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

location ~* (\.jpg|\.png|\.css)$ {
    valid_referers blocked mydomain.com www.mydomain.com;
    if ($invalid_referer) {
        return 444;
    }
}
于 2010-10-21T17:53:43.877 回答
3

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

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

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

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

于 2010-10-21T17:54:29.367 回答
2

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

?>
于 2014-03-18T09:38:23.263 回答
1

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

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

于 2010-10-21T17:53:26.707 回答
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]
于 2016-12-06T10:55:02.250 回答
0

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

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

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

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

于 2020-02-18T03:55:59.303 回答
0

阿帕奇

httpd.conf

<Directory "/var/www/html/img">
    AllowOverride None
    order deny,allow
    Options FollowSymLinks
</Directory>
于 2021-07-18T19:37:00.840 回答