2009-07-16 2 views
0

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

Я знаю несколько вещей: Сайт сделан в PHP Существует галерея изображений, URL-адрес будет что-то вроде http://www.example.com/girls/Cyn/sets/getImage/1170753147/7.jpg

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

Второе, что я выхожу из системы, я перенаправлен на страницу регистрации/регистрации.

Это сайт с тяжелым ударом.

Как это делается? Я могу сказать, что они бегут apache на Cent. Когда я вхожу в систему, я получаю cookie, у которого есть хеш-то, что я уверен, что они используют, чтобы найти идентификатор, чтобы убедиться, что мне разрешено войти в систему.

Однако вышеприведенное является прямым запрос на ресурс, который является только jpg. Затем должно быть некоторое сообщение с Apache и их базой данных, чтобы увидеть состояние этого запроса. Как просто загрузить URL-адрес, отправить значение cookie в apache, которое затем может передать его в базу данных?

Я собираюсь встать на платный сайт членства и должен будет защищать изображения таким же образом. Это не было http auth, это был вход в форму, и я не понимаю, как это было сделано. Есть идеи?

+0

член GodsGirls.com, а? –

ответ

2

Возможно, это веб-приложение, использующее cookie сеанса для аутентификации и перенаправления, если сеанс не прошел проверку подлинности.

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

3

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

Если у вас есть firebug, откройте вкладку «Сеть», когда вы находитесь на этом сайте, и проверьте все сделанные вами запросы. Вы увидите в заголовках запроса строку «Cookie». Это будет на каждом запрошенном ресурсе: изображения, таблицы стилей, все.

Если Apache является веб-сервером, он может использовать mod_rewrite для направления вашего запроса или передать его на PHP или Perl или что-то еще, что может проверить файл cookie и вывести изображение, если оно действительное или перенаправлено, если нет.

Вот пример PHP (вывод изображения взяты из php.net):

if(valid_auth($_COOKIE['auth'])) { 

    // open the file in a binary mode 
    $name = './img/ok.png'; 
    $fp = fopen($name, 'rb'); 

    // send the right headers 
    header("Content-Type: image/png"); 
    header("Content-Length: " . filesize($name)); 

    // dump the picture and stop the script 
    fpassthru($fp); 
    exit; 

} else { 

    header('Location: /login'); 
    exit; 
} 
0

Тем не менее, выше, представляет собой прямой запрос на ресурс, который является только JPG. Затем должно быть некоторое сообщение с Apache и их базой данных, чтобы увидеть состояние этого запроса. Как просто загрузить URL-адрес, отправить значение cookie в apache, которое затем может передать его в базу данных?

Каждый HTTP-запрос отправляется на веб-сервер. Затем веб-сервер решает, как обрабатывать запрос, на основе набора правил.По умолчанию Apache имеет простой обработчик, который просто отправляет запрошенный файл обратно пользователю. Однако нет никаких причин, по которым вы не можете настроить Apache для обработки всех запросов с помощью php-скрипта. На сайте с высоким трафиком вы, вероятно, решаете это по-другому, так как для каждого отображаемого изображения достаточно немного запускать php для каждого изображения, но теоретически вы можете просто создать правило mod_rewrite, которое обрабатывает все запросы, соответствующие определенному шаблону (такой как ^girls/Cyn/sets/getImage/.*) в php-скрипт. Затем этот скрипт будет считывать фактический файл где-то за пределами веб-корня и распечатывать его пользователю.

1

Вы должны создать «получатель» для изображений. Изображения должны храниться в папке вне общедоступных каталогов.

/public_html 
    /js 
     jquery.js 
    index.php 
    getimage.php 

/private_images/ 
    myimage.jpg 

Обратите внимание, что private_images каталог не доступен, когда вы: http://www.mysite.com/private_images

Теперь, чтобы создать "геттер" сценарий.

/* This is getimage.php */ 
if(!isset($_SESSION['is_logged_in'])) { 
    header('Location: /login'); 
    exit; 
} 

/* 
Get the image_name from the URL 
You will be using something like: http://mysite.com?image_name=flowers.jpg 
This is the way to get the image. 
*/ 
$path = "/var/www/html/private_images" 
$name = $path.'/'.$_GET['image_name']; 
$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/jpg"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

Если вы пропустили комментарий выше, вы можете сделать это, чтобы получить изображение:

http://mysite.com?image_name=flowers.jpg 
Смежные вопросы