Защита сайта от Хотлинкинга (Hotlinking)

Приветствую Вас, гости и подписчики блога 4remind.ru. А знаете ли Вы, что такое Хотлинкинг (Hotlinking) и какой вред или польза от него может быть для вашего вэб-сайта? Если Вы не в курсе этого, то предлагаю Вам вкратце ознакомиться с понятием «хотлинкинга» и методами защиты от него.

Защита от Хотлинкинга (Hotlinking)

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

Это хорошо в тех случаях, когда Вы сами хотите, чтобы к примеру при открытии страниц сторонних вэб-ресурсов посетитель мог видеть какие-то фото, картинки, которые загружаются с вашего сайта, или, например, Вы содержите вэб-сервер как общедоступное хранилище изображений, при этом свободно разрешая Хотлинкинг. Однако в таких случаях стоит принимать во внимание то, что при большом количестве ваших изображений и активном использовании хотлинкинга, нагрузка на ваш сервер (это особенно касается трафика) может оказаться уж очень огромной, что может привести либо к очень медленному открытию страниц вашего сайта, либо вообще к его недоступности.

Для большинства же персональных сайтов, блогов с большим количеством изображений и относительно «бюджетным» хостингом или тарифным планом допускать использование хотлинкинга не приемлемо. Исходя из этого предлагаю вам пару проверенных и многими используемых способов защиты.

Итак, вот пример защиты сайта от хотлинкинга при помощи .htaccess и mod_rewrite (модуля сервера Apache):

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?vashsait\.org [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpeg|jpg|gif|bmp|png)$ - [F]

В приведенном примере Вам нужно заменить «vashsait\.org» на доменное имя своего сайта. Защита от хотлинкинга будет действовать в отношении файлов изображений с расширениями jpeg, jpg, gif, bmp, png.

При необходимости Вы конечно же можете добавить (или убрать) другие расширения, и не только для изображений, подставив их в строку №4, разделяя указанные там расширения символом вертикальной черты «|».

Однако, в связи с тем, что при использовании выше приведенного примера, при попытке хотлинкинга будет выдаваться ошибка 403 (403 Forbidden — доступ запрещен), то лучше применять немного другой подход, точнее чуть измененную логику, а именно, вместо «403-го» ответа позволить показывать изображение-заглушку, которой может служить либо конкретный графический файл минимального размера, например 1х1 пикселей, либо файл-изображение, которое будет гласить о том, что была попытка без разрешения «увести» картинку. Вот пример, в котором применяется использование файла-заглушки «zaglushka.gif»:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?vashsait\.org [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpeg|jpg|gif|bmp|png)$ http://www\.vashsait\.org/images/zaglushka\.gif [L]

Вот еще пример, где реализована блокировка использования хотлинкинга только для двух конкретных серверов: livejournal.com и blogspot.com:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?livejournal\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?blogspot\.com/ [NC]
RewriteRule .*\.(jpeg|jpg|gif|bmp|png)$ http://www\.vashsait\.org/images/zaglushka\.gif [L]

Если же на вашем хостинге используется веб-сервер Nginx и к его конфигурации (файл nginx.conf) у Вас есть доступ, то можно воспользоваться следующим специальным скриптом, который будет блокировать все хотлинки:

location ~* ^.+\.(jpeg|jpg|gif|bmp|png)$ {
   root /your/path/to/root;
   rewrite ^ /zaglushka.gif last;
}
 
location /zaglushka.gif {
   root /your/path/to/zaglushka;
}

Подсказка:
в примере вместо подстрок «/your/path/to/» Вам нужно будет указывать конкретный путь, который используется непосредственно на вашем ресурсе.

Если же Вы захотите разрешить хотлинкинг (hotlinking) для некоторых сторонних сайтов, то можно немного изменить приведенный выше код и добавить проверку разрешенных сайтов по параметру «реферер», и для веб-сервера Nginx это будет выглядеть так:

location ~* ^.+\.(jpeg|jpg|gif|bmp|png)$ {
   root /your/path/to/root;
   
   valid_referers none blocked server_names ~\.site1\. ~\.site2\. ~\.site3\.;

   if ($invalid_referer) {
      rewrite ^ /zaglushka.gif last;
   }
}
 
location /zaglushka.gif {
   root /your/path/to/zaglushka;
}

Таким образом при помощи этого скрипта, добавленного в файл nginx.conf, будет разрешен хотлинкинг только для сайтов с реферером site1, site2 и site3.

Подсказка:
- Разрешенные «рефереры» перечисляются в строке:
valid_referers none blocked server_names ...
- Проверка «реферера» на предмет попадания его в список разрешенных осуществляется в условии:
if ($invalid_referer) { ... }

Вот пожалуй и все основные премудрости защиты от Хотлинкинга.
Удачи Вам в борьбе с нежелательными элементами!

Метки: htaccess, nginx, защита, Хотлинкинг

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

26 комментариев к “Защита сайта от Хотлинкинга (Hotlinking)”

  1. Вит:

    Не совсем уверен, что для файлов с расширением JPG, PNG.. (в верхнем регистре) будет нормально работать
    RewriteRule .*\.(jpeg|jpg|gif|bmp|png)$ http ://www\.vashsait\.org/images/zaglushka\.gif [L]

    но в целом скрипт интересный. Спасибо

    • Вит,
      чтобы не сомневаться, можно просто добавить к директиве флаг «NC» (nocase):

      RewriteRule .*\.(jpeg|JPG|gif|bmp|PNG)$ http: //www\.vashsait\.org/images/zaglushka\.gif [NC,L]

      Тогда в директиве будет игнорироваться регистр символов.

  2. artis72:

    Смежный вопрос новичка — а водяные знаки от воровства картинок уже не помогают?

    • Да, от прямого воровства помогают и водяные знаки, но ведь здесь речь не о том, что воруют картинки (типа скопировал картинку и разместил ее у себя на страничке), а о том, что воруют ваш трафик (плюс изрядно нагружают хостинг-сервер). То есть копируют не саму картинку, а ссылку на нее и подгружают вашу картинку в свой сайт, причем это происходит при каждом обращении к странице, в которую подгружается картинка с вашего сайта.

      • rza2008:

        Согласен, нагрузка на хостинг огромная. Как то ловил такой косяк. Пришлось в ручную перезалить картинки и сменить им адреса

  3. Андрей:

    я что то не понял. А разве картинка поставленная с вашего сайта не дает вам ссылки.

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

  4. Евдокимов:

    Нужная штука, но в код лезть самому стремно.

  5. Татьяна Чиронова:

    Спасибо, а то ведущие свои дневники на Ливинтернете любят пользоваться чужими скриншотами. Я уже однажды меняла картинки, но не будешь же это делать постоянно.
    А почему у Вас не стоит такой код? Я скопировала и поставила на блог Вашу картинку по ссылке.

    • Татьяна, а с чего Вы взяли, что у меня не стоит такой код?

      «Я скопировала и поставила на блог Вашу картинку по ссылке.» — а теперь почистите кэш браузера и перезагрузите ту страницу и посмотрите, что получится :)

      Картинка у Вас видимо появилась в кэше браузера еще до того, как была опубликована эта статья и до того, как я поставил код, т.е. если Вы раньше посещали мой блог, и эта картинка будет видна только Вам, но не новым посетителям вашего сайта.

  6. Teresa:

    Такс… Что-то я совсем тут запуталась :( А как это узнают? Нагружены картинки или нет? Интересно, а на видео это распространяется? Я совсем чайник :(

    • Обычно это проявляется в чрезмерно большом трафике с вашего сайта.
      На видео это тоже может распространяться, если конечно сами видео-файлы находятся на вашем же сервере. Защита такая же — добавить соответствующие расширения файлов в директиве RewriteRule, например: RewriteRule .*\.(swf|avi)$ — [F]

  7. Teresa:

    А где смотреть трафик с моего сайта? Я недавно его создала.
    И столько, оказывается, надо знать…

    • Статистику по трафику обычно смотрят в логах или на графиках, которые предоставляет хостинг (в панели управления сайтом). Правда разные хостинги по разному это делают, так что если что-то не понятно или недоступно, то достаточно написать вопрос в службу поддержки хостинга.

  8. Дмитрий:

    Почему не стала работать защита от хотлинкинга? Раньше работала. Использую способ с редиректом на заглушку.

    • Дмитрий:

      Попробовал, с вашего сайта тоже можно тырить картинки нагружая хостинг! Я в шоке, в чем причина?

      • Дмитрий, ну у меня-то временно отключена защита (для теста), поэтому вы и можете загружать картинки с моего блога. А по поводу вашего сайта… Вы проверьте, остались ли ваши записи для защиты в файле .htaccess.

        Дело в том, что некоторые плагины WordPress или Joomla после своих обновлений могут перезаписать .htaccess, не сохраняя вами внесенные правила.

        • Дмитрий:

          Попробуйте сделать хотлинкинг с моего блога. У меня все прописано как надо в .htaccess

          PS Давно пользуюсь защитой от хотлинкинга, но сегодня совершенно случайно узнал, что она перестала работать.

          • Дмитрий, я вижу, что у вас анти-хотлинкинг не работает, а вот у меня работает, после того, как я включил защиту. Можете проверить, только почистите весь кэш своего браузера.

  9. Дмитрий:

    Да у вас работает защита.
    Есть какие то предположения почему не работает у меня?
    Может хостер изменил какие-то настройки сервера?

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

      • Дмитрий:

        Я все-таки нашел где собака порылась… Написал хостеру и дали ответ, цитирую:
        Здравствуйте, мы можем отключить Вам кеширующий сервер для обработки хотлинков файлом htaccess, однако может возрасти потребляемые ресурсы сервера для Вашего аккаунта.

        А то, что анти-хотлинкинг как раз таки уменьшает нагрузку на хостинг они забыли? Блин что творится в головах у суппортов хостинга… Теперь все работает! Спасибо Владимир, что участвовали в разрешении проблемы!

        • Дмитрий, поздравляю с решением проблемы!
          От себя хочу кое-что добавить. Ваш хостер скорее всего использует кэширующий прокси-сервер Nginx, и отключать его было бы не желательно, т.к. он как раз очень даже хорошо снижает нагрузку на сайт, особенно при большой посещаемости. И в этой статье как раз приводится пример защиты от хотлинкинга на Nginx. Так может Вам лучше было бы обратиться к хостеру и попросить включить эту защиту (если у Вас самого нет доступа к настройкам Nginx)? Этим бы Вы решили сразу 2 задачи.

          • Дмитрий:

            Я использую кеширование на блоге средствами CMS, хотя в принципе кешерование можно отключить вообще, средняя нагрузка всей моей площадки хостинга 1/8 от максимально-допустимой.

            Хостинг beget, где хостятся мои сайты, меня разочаровывает все больше и больше. В дополнение к вышесказанному, они сделали настройки сервера такими, что почта отправляемая через обратную связь моих сайтов приходит с подменного имейла который задали суппорта хостинга. Хорошо, что хотя бы при ответе исходный имейл вставляется и то только после неоднократных моих жалоб. Объяснили тем, что якобы: они обезопасили хостинг от спамеров. Мое мнение таково: грамотные спамеры все-равно найдут способ как обойти их подмену имейла, а вот постоянных пользователей из-за этих ограничений они потеряют немало. Я уже подыскиваю другой хостинг!

  10. Дмитрий, странно конечно, что у хостинга Beget такое, он ведь по версии _hosting-ninja.ru типа в ТОП-е, причем в основном на первом месте.

    • Дмитрий:

      Видимо раскрутились, можно теперь и пальцы гнуть. Я лично никому не советую Beget, проблем не оберетесь. В последнее время один из моих сайтов яндекс забанил, как я дкмаю из-за того, что на этом же IP много ГСов хостятся. Короче Beget стал помойкой для ГСов, как когда то был Jino. Наверное снова на Джино перейду.

Оставить комментарий к Дмитрий

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Ссылки на Ваш сайт получат статус DoFollow после третьего комментария.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера



Наверх
Наверх