Как защитить от прямого доступа к изображениям? - PullRequest
17 голосов
/ 21 октября 2010

Я хотел бы создать веб-сайт с большим количеством изображений.Но я хотел бы защитить от прямого доступа к изображениям, например, прямых ссылок на изображения без посещения веб-сайта.

Какой предпочтительный способ сделать это?И каковы альтернативы с плюсами и минусами?

У меня есть некоторые идеи (я не знаю, возможны ли они):

  • Права доступа к файлу
  • PHPСессии
  • Временные имена файлов или URL-адреса
  • Перенаправление HTTP?

Может быть, это не практикуется на многих веб-сайтах?Например, я пытался получить доступ к личной фотографии в Facebook, не входя в систему, но я все еще мог посетить эту фотографию.

Платформа, вероятно, будет машиной Ubuntu с NginX и PHP.

Ответы [ 8 ]

19 голосов
/ 21 октября 2010

http://us3.php.net/image

Вы связываете элемент img с файлом php.Этот файл проверяет, есть ли у пользователя необходимые разрешения, и если это так, он может отправить ответ img обратно.

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

Тем не менее, кто-то с разрешением может загрузить изображение и предоставить его другим людям в другом месте (веб-пространствопочта / все).Чтобы сделать кражу немного сложнее, вы можете отключить щелчок правой кнопкой мыши по изображению, но, тем не менее, у пользователя, который немного разбирается в http, не должно возникнуть проблем с его кражей.Вы можете поставить подпись над изображением (например, логотип / название вашего сайта), чтобы люди могли видеть, что вы находитесь там, где находится источник.Это может быть сделано с PHP Aswell

1008 * Если вы хотите быть Весёлыми вы можете установить в другом изображении (порно отлично подходит для этого: P)., Который посылается, если связь происходит из другой страницы: P
7 голосов
/ 01 декабря 2012

Добавьте простой файл .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, даже если я считаю, что найти кого-то, кто пытается, будет страннымскрести их.

6 голосов
/ 17 сентября 2014

Вы можете динамически защитить папку, используя 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.

Также обратите внимание, что я поставил идентификатор пользователя в комментарии справа от ip в файле htaccess. Когда пользователь выходит из системы, вы можете выполнить поиск файла htaccess и удалить IP-адрес пользователя.

Вы можете обновлять это при каждом запросе, чтобы запретить пользователям, использующим динамические ips.

Я использую этот метод со всеми моими участками, это отличный дополнительный уровень безопасности. Просто убедитесь, что вы поместили свой лог в скриптах вне папки членов.

3 голосов
/ 21 октября 2010

Это может быть полезно: Разрешить / запретить хотлинкинг изображений с помощью .htaccess

Редактировать: одна вещь, на которую следует обратить внимание в этом методе, заключается в том, что некоторые программы браузера / AV / брандмауэра удаляют данные Referer, когдавы просматриваете, что может привести к тому, что потенциально легитимные пользователи будут рассматриваться как горячие линкеры.

Если ваш сайт уже использует какую-либо систему аутентификации или сеансовую систему, то было бы лучше использовать метод, указанный в ответе @Mark Baijens.

Обновление: правило перезаписи NGiNX для предотвращения хотлинкинга:

location ~* (\.jpg|\.png|\.css)$ {
    valid_referers blocked mydomain.com www.mydomain.com;
    if ($invalid_referer) {
        return 444;
    }
}
2 голосов
/ 18 марта 2014

Я использую оба метода - проверка пользователя и реферера.Пользовательский агент я проверяю на .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]

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);

?>
2 голосов
/ 21 октября 2010

Вы можете использовать PHP-скрипт для получения изображений, используя что-то вроде:

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

и заставить PHP-скрипт возвращать данные изображения только после подтверждения того, что домен HTTP_REFERERваше.

Если у вас есть сайт, ориентированный на учетную запись, я предлагаю использовать сеансы PHP, как вы заявили, и сделать так, чтобы скрипт PHP проверял сеанс перед возвратом данных изображения.

1 голос
/ 21 октября 2010

Это будет трудно сделать. Чтобы веб-браузеры ваших клиентов имели доступ к изображениям, они должны быть доступны для чтения. Разрешения на файлы не будут работать, потому что вам нужно предоставить доступ к браузеру. Вы не сможете помешать кому-либо загружать их и что-то делать с ними.

Если вы хотите только прекратить прямые ссылки, если вы регулярно меняете имена файлов и обновляете свои страницы, чтобы отразить это, ссылки на других страницах будут повреждены.

0 голосов
/ 06 декабря 2016

Добавьте Deny Rule в свой .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]
...