Home > FreeBSD > антихотлинк

антихотлинк

December 9th, 2008

Апач:

.htaccess или Directory
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER}  !^http://.*mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER}  !^http://.*google.*$ [NC]
RewriteRule .*[Jj][Pp][Gg]$|.*[Gg][Ii][Ff]$ http://google.com [R,L]

nginx:

location ~* ^.+\.(jpg|jpeg|gif|mpg)$ {
    valid_referers none blocked server_names ~\.google\. images.yandex.ru ~\.mydomain.com ~\.mydomain2.com;
    if ($invalid_referer) {
    return 404;
    }
}

Проверить, если в конфиге nginx сделано так:

server_name ~^(.*)$;

то пункт “server_names” надо убрать из valid_referers
Естественно если уже сделана прямая отдача статики, то надо конструкцию valid_referes … писать внутри того Location

Если надо заблокировать трафик с определенных рефереров, то в nginx делаем так:

valid_referers baddomain1.com baddomain2.com www.baddomain1.com www.baddomain2.com;
if ($invalid_referer != 1) {
return 404;
}

FreeBSD , ,

  1. February 16th, 2009 at 01:51 | #1

    а для чегт нужен этот самый антихотлинк?
    что такое хотлинк?

  2. admin
    February 16th, 2009 at 17:54 | #2

    Хотлинк, это когда владелец другого сайта использует картинки/видео на своем сайте линкуя их напрямую с вашего. Таким образом он разгружает от отдачи тяжелого контента свой сервер и нагружает ваш. И при больших объемах это становится очень чувствительно по бэндвичу и, соотвественно, по деньгам.

  3. Алексей
    January 21st, 2013 at 06:30 | #3

    Как я полагаю если подделать реферер, то антихотлинк не сработает ?

  4. admin
    January 21st, 2013 at 06:55 | #4

    Не сработает. Другое дело, что довольно затруднительно встроить чужую картинку на свой сайт и не изменить реферер.

  5. Алексей
    January 21st, 2013 at 08:15 | #5

    Исходя из примера, всем известно проверяемое значение – это полное доменное имя сайта-жертвы. Зная это – любой (кто может правильно отправить пост запрос) без труда подделает реферер в соответствующей строке.
    Я занимался этим для передачи данных на свои поддомены, в автоматическом режиме (к секретному хранилищу видеофайлов), юзер один раз кликнул ссылку на основном сайте, а запрос пошёл дальше в нужное хранилище. Разумеется любого другого доступа к нему нет, но можно в менеджере закачек подсмотреть полный путь. Для этого и делался абсолютный антихотлинк. Подделать не возможно, т.к. реферером является не доменное имя а уникальный ключ. А я отнюдь не супер-хаккер. Вообще – ДЕЛИТАНТ. Значит это может любой успешный программист. Здесь уже цена вопроса! Надо искать другой способ или в дополнение к этому.
    Мой способ с секретным ключом не подходит т.к. слишком накладный.

  6. admin
    January 21st, 2013 at 08:31 | #6

    Вы видимо не совсем верно представляете цель антихотлинка, в частности, применительно к фото и видео. Здесь суть в трафике.
    К примеру, я сфоткал и выложил на своем блоге 10 000 качественных фотографий, каждая размером 1 мегабайт (а может и видео-роликов, не важно). Теперь, чтобы показывать их своим многочисленным посетителям мне приходится оплачивать канал в 50 мегабит ~ $100/месяц (цифра от балды). Вы, как владелец схожего блога, тоже хотите показывать их _своим_ посетителям, но не хотите тоже платить за трафик 100 баксов. Тогда вы просто ставите ссылку на фотки на мой сайт. В результате за свой и ваш картиночный трафик плачу я, и уже больше 100 баксов! А вы имеете довольных посетителей и интересные фотки у себя на сайта абсолютно бесплатно!
    Вот от такого сценария и защищает описанный антихотлинк.

  7. Алексей
    January 21st, 2013 at 09:07 | #7

    Я всё прекрасно представляю и цель и последствия недоработки в безопасности. Но в том-то и проблема, что защищает только от школоты. А от меня уже не защитит. Другое дело, что лично мне нет дела до ваших картинок с трафиком.
    Моя задача сделать так, что-бы закрытые фото пользователями (пользователь установил определённые права доступа, у меня спецефичный проект с избирательным доступом. Кому можно смотреть, определяет – владелец своего фотоблога – у меня на сайте) не мог никто видеть кроме разрешённой группы или отдельных лиц. Про хотлинк (в моём случае) я вообще молчу. Это должно быть полностью исключено, на более безопасном уровне. Именно его я и ищу.
    При этом само решение, должно быть с минимумом геморроя в коде. Сама поставленная мной задача уже и есть этот геморрой. Но специфика проекта такова и отступить(применить только рядовой антихотлинк) – нельзя.

  8. Алексей
    January 21st, 2013 at 10:49 | #8

    Похоже придётся делать выборку картинок через PHP.
    Щас посмотрю насколько от этого увеличится время выполнения скрипта.

    Помимо всего прочего картинка не должна отдаваться даже при прямом вызове из браузера (поместив ссылку в адресную строку). Нельзя исключать тот вариант, что адрес картинки можно узнать простым перебором (пусть и потратив неделю или пару лет). Я должен исключить любой доступ к картинкам из вне!

    На одном сайте очень забавная картина. Смотреть полноразмерки можно только зарегеным. Но мы спокойно находим thumb с идентичным путём к полноразмерке! Надо всего-лишь поменять одну буковку в строке и в дамках.
    Я такое у себя не могу допустить. Это просто – не серьёзно.

  9. admin
    January 21st, 2013 at 11:02 | #9

    Посмотрите антихотлинковый механизм, который встроен в nginx. Подобные алгоритмы реализованы уже много где.

  10. Алексей
    January 21st, 2013 at 11:32 | #10

    Похоже Вы меня не понимаете. Проверка в nginx ведётся по реферу. Его любой кому надо подделает в один счёт. Или Вам известны другие варианты ? (антихотлинка через nginx). Проверки по IP и прочему, вообще не катят.

  11. Алексей
    January 21st, 2013 at 16:05 | #11

    Нашёл одно решение, но оно не решает мою задачу – не показывать картинки по прямой ссылке введённой в адресной строке браузера!
    ….

    Ну Вот покумекав и потыкав решил задачу целиком и полностью и самое главное 3-мя элементами по 1-й строчке. Всего 3 строки и никаких условий!

    Хотите увидеть как это просто делается, а успех 1000% и самое главное БЕЗ проверки реферера. Собственно говоря ничего вообще не проверяется. Просто небольшая хитрость.

  12. admin
    January 21st, 2013 at 17:14 | #12

    Поделитесь решением, покритикуем.

  13. Алексей
    January 21st, 2013 at 18:07 | #13

    Я уже сам себя покритиковал)))

    Погорячился малость, но всё равно добился своего.

    Проверки всё-таки делать пришлось. Но только рефером я не ограничился.
    Скрипт который отдаёт картинки на входе проверяет установлена сессия или нет “session_start()” Пользователь сайта при входе на сайт её устанавливает автоматически (короткую) А любой из вне её не может установить (isset)- не верно и получает белый экран вместо картинки.

    Критикуйте

  14. Алексей
    January 23rd, 2013 at 21:29 | #14

    Победа)))

    Я полностью протестировал свою защиту по сессии. И она действительно сработала в 3 строки. Просто я сначала проверял её будучи на самом сайте (на котором используется Sантихотлинк), присутствуя на нём. И соответственно посетив сайт который захотлинковал мои картинки, Они мне успешно отдавались, т.к. существует сессия. Более того браузер должен быть один и тот-же (разумеется). Но как только я покинул оригинальный сайт с картинками. Сайт хотлинкера ПОЛНОСТЬЮ потерял доступ к картинка и сделать ему ничего не возможно, ровно как и сессию подделать НЕВОЗМОЖНО ! Её может создать только мой оригинальный сайт когда пользователь сам лично наго зайдёт.

    Такая защита делает абсолютно бессмысленным любое хотлинкование (любых медиа файлов). Так как до тех пор пока пользователь, не зайдёт на сайт источник, он никогда ничего не увидит.
    Единственное, я не стал полностью отказываться от проверки по рефереру. И делаю запрет отдачи картинок по вызову их из адресной строки, вводом прямой ссылки (исключаю любой перебор и пр.) Разумеется это я реализовал как в вашем примере дабы не грузить скрипт.

    Жду критики – ЛЮБОЙ!

  15. Алексей
    January 23rd, 2013 at 21:43 | #15

    Почему невозможно подделать сессию? Ведь сайт хотлинкера по идее тоже может её создать.
    Всё дело в том, что сессия должна быть создана ИМЕННО моим сайтом “images.ru” только сессию с таким источником узла, распознаёт скрипт отдающий картинки. И это должно быть указанно на сервере. Любая мыслимая и не мыслимая подделка исключена. Пока пользователь ЛИЧНО не посетит мой сайт, как не бейся но мой узел “images.ru” в упор не будет знать о существовании этого пользователя и ничего ему не отдаст.
    Вот такой механизм работы защиты. В принципе он уже давно реализован самими сессиями. Я только им воспользовался.

  16. admin
    January 24th, 2013 at 11:27 | #16

    У меня есть такой вариант: хотлинкующий сайт вставляет в своем коде сначала вызов какой-нибудь небольшой страницы вашего сайте в виде (например) “img src=’адрес вашего сайта’ width=’0′”. А потом уже идут сами картинки.
    И по идее они должны отображаться у пользователя, так как сессия у него уже будет.

  17. Алексей
    January 24th, 2013 at 20:44 | #17

    Ничего не выйдет до тех пор пока пользователь не посетит мой сайт.

    Ни-одна небольшая страница на моём сайте не запускает сессию !
    Сессию запускает только фотогалерея или успешная авторизация (уже (!) зарегестрированного пользователя), но любой вход на неё из вне отсылает, на страницу приветствия. И на главной тоже сессии не создаются.

    Сайт сконструирован таким образом, что пользователь запускает определённое событие. Все странички работают в зависимости от того, что делает пользователь. Каждый раз всё по разному вызывая одну и туже страницу. А всё, что не известно (ваш хотлинк) прямиком в баню, а новый пользователь только на стартовую страницу. Ну а далее “карьерный рост” этого пользователя.

    Я только что провепил ваш вариант и он потерпел полное фиаско (в плане сессии) не говоря о том, что и обычный Антихотлинк установлен (на время проверки разумеется отключил).

    Что ещё предложите ?

  18. Алексей
    January 24th, 2013 at 21:12 | #18

    ………
    Я проверил Ваш способ ещё раз, но на этот раз создавая сессию сразу на стартовой. Разумеется сработало)) Но архитектура моего сайта не допускает такой сценарий (если сессию создать сразу на стартовой, он просто будет не правильно работать.)

    Да блин, мой вариант достаточно специфичный.
    И не для непредусмотрительных админов. Сайт трясущийся за свои картинки изначально должен быть правильно сконструирован. Именно это и редкость. Даже HTML код практически у всех, не оптимизирован. О чём тут вообще говорить.

    Конечно можно написать такой код, который будет залезать вглубь сайта (по ссылкам), но с этим очень легко побороться. Ставим тайм лимит 3 секунды. Любой кто оказался более шустрый (ваш способ) моментально в баню. Останется писать такой код который будет выжидать это время, а это приведёт к задержке отображения страницы минимум на 10 секунд. Какой нормальный посетитель будет ждать столько и любоваться пустым экраном или рекламой ? (это я уже про учесть хотлингующего сайта)

    И всего-то ТРИ строки!!!!
    А столько ГЕМОРРОЯ хотлинкерам)))

  19. Алексей
    January 24th, 2013 at 21:30 | #19

    Ах, да))) Чуть не забыл самое главное:
    И разумеется – ГРАМОТНО сконструированный сайт!
    Система безопасности должна соответствовать назначению сайта

  20. Алексей
    January 24th, 2013 at 21:33 | #20

    Тем не менее жду дальнейшей критики. И спасибо, за уже сделанную)))

  21. Алексей
    January 25th, 2013 at 00:47 | #21

    Информация к размышлению:

    Телепорт (программа для выкачивания сайтов целиком) не смог пройти дальше стартовой страницы! При этом у меня нет никакой защиты от выкачивания сайтов и от поисковых роботов. Вообще нет файла Robots.txt в корне сайта. Нет никаких таймингов, задержек на частые обращения. Вообще пока ничего не реализовано из этой области. Но единственная результативная программа по выкачиванию сайтов, будто упёрлась в наглухо заваренную, входную металлическую дверь.
    Понимаете, что это значит ?

  1. No trackbacks yet.
Электрическая кофеварка-турка "Sterlingg" акция .