2010-10-21 4 views
14

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

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

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

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

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

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

+0

Вы можете получить доступ к «частной» фотографии на Facebook, потому что вы использовали ссылку прямого изображения, а не страницу с фотографиями. – drudge

+0

@jnpcl: Да, это то, что я хотел бы предотвратить на моем сайте. Вопрос в том, как это сделать? – Jonas

+0

Вы пытаетесь предотвратить хотлинкинг или что-то еще? http://stackoverflow.com/questions/1245869/allow-deny-image-hotlinking-with-htaccess – Greg

ответ

20

http://us3.php.net/image

Вы свяжете элемент IMG в файл PHP. Этот файл проверяет, имеет ли пользователь правильное разрешение, если он может отправить ответ img.

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

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

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

+3

Я использую этот метод на своем сайте, но когда на странице много фотографий, время показа страницы очень длинное (каждая фотография имеет проверку доступа и запрос сервера ...). Кто-нибудь имеет представление о том, что можно сделать для смягчения этой проблемы? –

+0

Такая же проблема здесь. Он загружается очень медленно, и я не могу работать с Lazy. Есть ли другой способ? – desmeit

1

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

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

+0

Хорошая точка, изменяющая имена файлов, никогда не задумывалась об этом. Конечно, он не отказывает в загрузке или доступе хотя бы один раз (грубая сила), но, по крайней мере, тасует карты, протирающие вредоносные прогрессии. – TechNyquist

3

Это может быть полезно: Allow/deny image hotlinking with .htaccess

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

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

Update: правила перезаписи Nginx для предотвращения хотлинкинга:

+0

Спасибо, однако я не могу использовать этот метод, так как я использую NingX в качестве веб-сервера и не имею никаких файлов .htaccess. – Jonas

+0

С некоторой настройкой, это [возможно] (http://wiki.nginx.org/NginxHttpRewriteModule). – drudge

+0

Спасибо, я посмотрю на это решение. – Jonas

2

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

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

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

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

4

Добавить простой .htacess файл в папке сайта с follwoing линиями на

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, чтобы найти кого-то, кто пытается царапать их.

2

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

?> 
4

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

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

0

Добавить 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] 
Смежные вопросы