Hotlinking (хотлинкинг) и защита от него

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



Если вы попали на эту странице, набрав ссылку с картинки — что ж... Добро пожаловать! Почитайте сайт в его первоисточнике. Думаю страница Навигации поможет вам в этом.

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

<img src="http://blog.undsoft.com/wp-content/uploads/see_through.png">

Плохой Вебмастер вставляет это себе в код страницы и готово. Пользователь пользователь разницу увидит только в случае ошибки. Беда в том, что hotlinking использует ресурсы вашего сервера — мало того, что это была картинка с вашего сайта, которую кто-то взял, это к тому же ваш траффик, каждый раз, когда кто-то смотрит чужую веб-страничку.

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

Htaccess vs. Hotlinking

Создайте в директории, где находятся ваши картинки, .htaccess файл и пропишите в нем следующее:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?undsoft\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?feedburner\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mail\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?poisk\.ru/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ nohotlink.png [L]

Для работы этого серверного правила потребуется специальный установленный модуль для преобразований URL — mod_rewrite. Идея в том, что когда браузер запрашивает у сервера картинку, он посылает в специальном http-заголовке информацию о том, с какой страницы пользователь попал на эту картинку. Этот заголовок называется реферером (от англ. refer — напрявлять, отсылать).

Если реферер на совпадает с адресом вашего сайта (в примере — с адресом моего сайта), вместо файлов з разрешением jpe?g|gif|bmp|png будет показана картинка nohotlink.png. Вопросительный знак jpe?g означает, что буквы e может не быть, то есть это блокирует как jpg, так и jpeg.

В этом случае, если браузер запросит что-либо из перечисленных типов файлов не с вашей страницы И при этом отправит REFERER, пользователь вместо этого файла увидит картинку nohotlink.png, на которой вы можете написать все, что пожелаете :) . Этот метод так же защищает от прямых ссылок на файлы — посетитель сможет скачать файл по ссылке только с вашей страницы.

В правила придется добавлять исключения для некоторых поисковых систем и сайтов. Да, знаю, это не слишком изящное решение, но лучшего я пока не придумал. Строка RewriteCond %{HTTP_REFERER} !^$ [NC] пропустит запрос пользователя, если referrer'a нет.

Этот метод не помешает Google — он сможет дальше без проблем кравлить картинки с сайта, так как он использует уже кешированные версии в результатах поиска.

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

RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]

и тогда сервер будет выдавать ошибку 403 (Forbidden) вместо содержимого.

P.S.

А почему бы при этом не сделать редирект не на картинку, а на специальный рhp-скрипт, который сначала запишет в лог этот параметр HTTP_REFERER, а уже потом выдаст картинку? Таким образом вы всегда будете знать, какой сайт пытается использовать ваше содержимое.




Также посмотрите:

  • Вот весь код касаемо хотлинкинга:

    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?wowlol\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.net/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?feedburner\.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mail\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?poisk\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^$ [NC]
    RewriteRule .*\.(jpe?g|gif|bmp|png)$ tokenfromwowlol.jpg [L]

    в самом верху файла есть строки:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.wowlol.ru
    RewriteRule ^(.*)$ http://wowlol.ru/$1 [R=301,L]

    не думаю что они должны повлиять на защиту. Все остальные строки это преобразование отображения страницы без .php и две строчки таких:

    php_flag display_errors on
    ErrorDocument 404 /404.php

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

    undsoft, что ты думаешь по этому поводу ?
  • Попробовал еще раз у себя.
    Вот здесь можно посмотреть: http://undsoft.com/test/

    Попробуйте у себя поставить картинку pri.gif, грузится будет все время - ivv_medium.jpg.

    Что делают строки:
    RewriteCond %{HTTP_HOST} ^www.wowlol.ru
    RewriteRule ^(.*)$ http://wowlol.ru/$1 [R=301,L]
    ?

    Убирает www, если он был?
    Может имеет смысл кинуть в папку с картинками отдельный htaccess только с кодом для картинок?
  • за время написания статьи мог поменяться синтаксис .htaccess ? у меня почему-то данная конструкция рботать не хочет хоть убей. что только не пробовал... картинку (которая заменяет ту, что украдена) кладу в корень, в хтаккесс дописываю то, что тут написано, меняя
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?undsoft\.com/.*$ [NC]
    на
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?wowlol\.ru/.*$ [NC]
    проверяю вот тут - http://agn.su/the-news/90-mir-wow.html
    и через прокси и через очистку кеша - не работает хоть убей.
    RewriteCond %{HTTP_REFERER} !^$ [NC] - это заменял последней строчкой - толку 0.

    мб я что-то делаю не так ? подскажите плиз в чём может быть проблема?
    можно в асю 743540, буду признателен за нахождение и выявление ошибки. очень очень)

    _____________________

    я оооооооочень извиняюсь перед автором блога если ему прищло таких сообщения. косячил с оупенайди....
  • Проверил у себя - все работает.
    Может вы забыли последнюю строчку? Напишите сюда весь код, что вы вставили в htaccess
  • "... в теории может привнести и дополнительных посетителей. Поменяйте последнюю строчку на..."

    интересно, как именно это привлечет дополнительных посетителей? вместо картинки браузер будет вставлять ваш ErrorDocument 403?
  • Можно заменять ворованную картинку на картинку с надписью "Эта картинка была взята с сайта..."
  • скажу как юзер - очень плохая штука! люди, не ставьте защиту от хотлинкинга! очень неудобно картинки на форумах постить//
  • an_manager
    Скажите плизз, а как текст защитить? у меня своровали почти весь текст с блога и Яндекс перстал меня индексировать....
  • Врят ли есть какой-нибудь хороший способ, что с этим можно сделать.
    У меня было похожее. Я был приятно удивлен Гуглом, который стабильно показывал мой сайт выше в списке результатов, несмотря на PR.
    И вроде на случай плагиата у Гугла есть какая-то страничка где можно пожаловаться. Я думаю и у Яндекса может быть нечто подобное - попробуйте им написать.
  • an_manager
    спасибо большое за совет!!!
  • а как же быть с форумами? там полно юзеров и все лепят картинки как хотят, править что ли после них?))
  • lisssenok
    Проверим =)
  • Nik
    Спасибо за код! получилось просто прелестно)
blog comments powered by Disqus