Как защитить от прямого доступа к изображениям?

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

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

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

  • Файловые права
  • Сессии PHP
  • Временные имена файлов или URL
  • HTTP перенаправление?

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

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

10 ответов

Решение

http://us3.php.net/image

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

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

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

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

Добавить простое .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 и 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, не могли быть запущены.

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

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

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

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

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

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

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

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

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

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

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

?>

В приведенных выше ответах есть проблемы с производительностью. Мое решение - войти в систему следующим образом.

Вы можете переименовывать каталог изображений каждый час / день и т. Д.

images/2h4h4h4h4282hdj/182828.pngк чему-то вродеimages/dhd777rhrje82883/182828.png

Вы можете сделать это для всей системы или для конкретного пользователя.

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

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

Добавьте 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]

Апачи

httpd.conf

      <Directory "/var/www/html/img">
    AllowOverride None
    order deny,allow
    Options FollowSymLinks
</Directory>
Другие вопросы по тегам