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, а уже потом выдаст картинку? Таким образом вы всегда будете знать, какой сайт пытается использовать ваше содержимое.



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

  • http://hotabych.com.ua/ Nik

    Спасибо за код! получилось просто прелестно)

  • http://spbworld.ru/ flipper

    а как же быть с форумами? там полно юзеров и все лепят картинки как хотят, править что ли после них?))

  • lisssenok

    Проверим =)

  • http://spbworld.ru/ flipper

    Type your comments here.

  • an_manager

    Скажите плизз, а как текст защитить? у меня своровали почти весь текст с блога и Яндекс перстал меня индексировать...

  • http://blog.undsoft.com undsoft

    Врят ли есть какой-нибудь хороший способ, что с этим можно сделать.
    У меня было похожее. Я был приятно удивлен Гуглом, который стабильно показывал мой сайт выше в списке результатов, несмотря на PR.
    И вроде на случай плагиата у Гугла есть какая-то страничка где можно пожаловаться. Я думаю и у Яндекса может быть нечто подобное — попробуйте им написать.

  • an_manager

    спасибо большое за совет!!!

  • http://www.ifoxy.ru/ Питер

    скажу как юзер — очень плохая штука! люди, не ставьте защиту от хотлинкинга! очень неудобно картинки на форумах постить//

  • http://andrey.eto-ya.com/ andrey

    "... в теории может привнести и дополнительных посетителей. Поменяйте последнюю строчку на...
    "
    интересно, как именно это привлечет дополнительных посетителей? вместо картинки браузер будет вставлять ваш ErrorDocument 403?

  • http://blog.undsoft.com undsoft

    Можно заменять ворованную картинку на картинку с надписью «Эта картинка была взята с сайта...»

  • vadim12312

    за время написания статьи мог поменяться синтаксис .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, буду признателен за нахождение и выявление ошибки. очень очень)

  • vadim12312

    за время написания статьи мог поменяться синтаксис .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, буду признателен за нахождение и выявление ошибки. очень очень)

  • vadim12312

    за время написания статьи мог поменяться синтаксис .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, буду признателен за нахождение и выявление ошибки. очень очень)

    _____________________

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

  • http://blog.undsoft.com undsoft

    Проверил у себя — все работает.
    Может вы забыли последнюю строчку? Напишите сюда весь код, что вы вставили в htaccess

  • http://wowlol.ru/ 4fun.fantasy

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

    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://wowlol.ru/ 4fun.fantasy

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

    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://blog.undsoft.com 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 только с кодом для картинок?

  • http://www.mixasik.lv/ Mixasik

    Поскольку Вы используете nginx перед апачем, то реврайт рулы на картинки работать не будут, ибо картинки отдаются самим nginx, есть возможность написать реврайт рулы для самого nginx, но синтаксис немного другой и прописывается это уже в конфиге nginx.

  • http://allsubmitter.dax.ru allsubmitter

    Спасибо, помогло!

  • http://cataclysmguide.ru/ cepik

    гы, Вадик в теме о воровстве с блога? ОМГ, да ты вообще с катушек поехал? ты у меня украл 27 статей с картинками вместе. Вот же блин...