Как защитить от прямого доступа к изображениям?
Я хотел бы создать веб-сайт со многими изображениями. Но я хотел бы защитить от прямого доступа к изображениям, например. прямые ссылки на изображения без посещения веб-сайта.
Каков предпочтительный способ сделать это? И каковы альтернативы с Плюсами и минусами?
У меня есть некоторые идеи (я не знаю, возможны ли они):
- Разрешения для файлов
- Сеансы PHP
- Временные имена файлов или URL-адреса
- Перенаправление HTTP?
Возможно, это не практикуется на многих веб-сайтах? Например. Я попытался получить доступ к частной фотографии на Facebook без входа в систему, но я все еще мог посетить фотографию.
Платформа, вероятно, будет машиной Ubuntu с NginX и PHP.
Ответы
Ответ 1
http://us3.php.net/image
Вы связываете элемент img с файлом php. Этот файл проверяет, имеет ли пользователь правильное разрешение, если он может отправить ответ img.
<img src="url/LoadImg.php?id=1337" alt="" />
Тем не менее, кто-то с разрешением может загрузить изображение и предоставить его другим людям в другом месте (webspace/mail/whatever). Чтобы сделать его немного сложнее украсть, вы можете отключить правый щелчок по изображению, но все же пользователь, который немного знает о http, не должен иметь никаких проблем, чтобы украсть его.
Вы можете разместить подпись над изображением (например, логотип/имя вашего сайта), чтобы люди могли видеть, что вы источник. Это также можно сделать с помощью php.
Если вы хотите быть Весёлый вы можете установить в другое изображение (порно отлично подходит для этого: P), который посылается, если связь происходит из другой страницы: P
Ответ 2
Добавьте простой файл .htacess
в папку сайта с последующими строками
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
файл, даже если я думаю, что он bizzare, чтобы найти кого-то, кто пытается их очистить.
Ответ 3
Вы можете динамически защищать папку, используя htaccess и пользователей ip.
Добавьте файл .htaccess в папку изображений со следующими строками:
order deny,allow
deny from all
Ответ 4
Это может быть полезно: Разрешить/запретить обращение к изображениям с помощью .htaccess
Изменить: одно замечание об этом методе заключается в том, что некоторое программное обеспечение браузера/AV/брандмауэра удаляет данные Referer при просмотре, что приведет к тому, что потенциально законные пользователи будут рассматриваться как хотлинкеры.
Если ваш сайт уже использует какую-то систему аутентификации или сеанса, то лучше использовать метод, указанный в ответе @Mark Baijens.
Обновление: правило перезаписи NGiNX для предотвращения hotlinking:
location ~* (\.jpg|\.png|\.css)$ {
valid_referers blocked mydomain.com www.mydomain.com;
if ($invalid_referer) {
return 444;
}
}
Ответ 5
Вы можете использовать PHP script для извлечения изображений, используя что-то вроде:
<img src="mysite.com/getimage.php?id=001" />
и PHP script возвращает данные изображения только после подтверждения того, что домен HTTP_REFERER является вашим.
Если у вас есть сайт, ориентированный на учетную запись, я предлагаю использовать сеансы PHP, как вы заявили, и проверите сеанс PHP script перед возвратом данных изображения.
Ответ 6
Я использую оба метода - проверку пользователя gent и referrer. Пользовательский агент я проверяю на .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);
?>
Ответ 7
Это будет трудно сделать. Чтобы веб-браузеры ваших клиентов имели доступ к изображениям, они должны быть доступны для чтения. Разрешения для файлов не будут работать, потому что вам необходимо предоставить доступ к браузеру. Вы не сможете остановить кого-то от их загрузки и сделать что-то с ними.
Если вы хотите прекратить прямую связь, если вы регулярно меняете имена файлов и обновляете свои страницы, чтобы отразить это, на других страницах будут сломаны ссылки.
Ответ 8
Добавить правило Deny в вашем .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]