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

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

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

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

  • Разрешения для файлов
  • Сеансы 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]