Не разрешайте горячую ссылку на изображения, если вы не вошли в систему - PullRequest
0 голосов
/ 16 июля 2009

Сегодня я столкнулся с чем-то, что я не уверен, как это делается.

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

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

После того, как я выйду из системы, я буду перенаправлен на страницу регистрации / входа.

Это очень популярный сайт.

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

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

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

Ответы [ 4 ]

3 голосов
/ 16 июля 2009

Все запросы проходят через веб-сервер. Если сайт устанавливает 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;
}
2 голосов
/ 16 июля 2009

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

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

1 голос
/ 16 июля 2009

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

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

/private_images/
    myimage.jpg

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

Теперь, чтобы создать скрипт "getter".

/* 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
0 голосов
/ 16 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...