Как защитить от прямого доступа к изображениям?
Я хотел бы создать веб-сайт с большим количеством изображений. Но я хотел бы защитить от прямого доступа к изображениям, например, прямых ссылок на изображения без посещения веб-сайта.
Каков предпочтительный способ сделать это? И каковы альтернативы с за и против?
У меня есть некоторые идеи (я не знаю, возможны ли они):
- Файловые права
- Сессии PHP
- Временные имена файлов или URL
- HTTP перенаправление?
Может быть, это не практикуется на многих веб-сайтах? Например, я пытался получить доступ к частной фотографии на Facebook, не входя в систему, но я все еще мог посетить эту фотографию.
Платформа, вероятно, будет машиной Ubuntu с NginX и PHP.
10 ответов
Вы связываете элемент 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>