Запрещаем хотлинкинг (hotlink) в Apache и nginx — как защитить свои картинки и другие медиа файлы от показа на других сайтах

16 Декабрь, 2013

Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Смотрите, если вы скопируете ссылку на любую картинку, живущую на данном ресурсе, и вставите ее в атрибут src тега img на своем сайте, то данное изображение с успехом отобразится, подгрузившись с моего сервера, а сам процесс будет называться «хотлинкинг». Хорошо это или плохо для вас и для меня? Вопрос неоднозначный и требует индивидуального подхода.

Что такое хотлинки и как их запретить в Apache через .htaccess


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

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

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

Можно пытаться искать хулиганов с помощью сервисов или программ антиплагиата и воздействовать на них словесно, но они бывают весьма упертыми, а зачастую и ленивыми. Поэтому отключение использования hotlink в настройках Apache или nginx может быть одним из способов борьбы и снижения числа копий вашего ресурса на просторах интернета.

Для KtoNaNovenkogo.ru я не использую защиту от хотлинков, но вот для другого моего проекта такая необходимость недавно назрела. Тот ресурс имеет новостной характер со множеством иллюстраций. Тексты там уникальные и основным источником монетизации является продажа вечных ссылок (в ГГЛ, РотаПосте и ГетГудЛинксе) и размещение статей (в Миралинксе, а последнее время и в Вебартексе). Все остальное просто не работает.

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

Запретить подгрузку различных статических данных с сервера по прямым ссылкам совсем не сложно, если он работает под управлением Apache. В этом случае можно использовать специальные файлик удаленного управления сервером, которые все вы наверняка знаете и который называется .htaccess (с точкой в начале).

Файлик поистине замечательный, ибо вам достаточно будет подключиться к сайту через FTP клиент и добавить в него несколько строк (предварительно скопировав его в изначальном виде к себе на компьютер, ибо форс мажор приходит в самый не подходящий момент).

Живет он в самом корне вашего сайта (обычно корнем является либо папка PUBLIC_HTML, либо HTDOCS). Если его не видать, то включите в файлзиле на вкладке «Сервер» принудительное отображение скрытых файлов.

Если его нет, то создайте обычный текстовый файлик у себя на компьютере, поменяйте его название на требуемое, сотрите расширение и кидайте его по Фтп в корень своего сайта.

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

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

 RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?vash-site.ru [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

Останется только добавить вместо vash-site.ru ваш домен, а для всех остальных Hotlinking будет под запретом.

Если вы хотите все же отдавать со своего сервера отдельные графические файлы, например, файл баннера для вставки на других проекта или чего еще (в расположенном ниже примере это banner.gif), а так же хотите, чтобы все хулиганы похитившее ваш контента об этом жестоко пожалели (увидев вместо различных картинок одну и ту же заглушку chtobtytakzhil.gif с подробным изложением всего того, что вы о них думаете), то подойдет такой вариант:

RewriteCond %{HTTP_REFERER} !^http://www\.vash-site\.ru/ [NC]
   RewriteCond %{REQUEST_URI} !banner\.gif$ [NC]
   RewriteCond %{REQUEST_URI} !chtobtytakzhil\.gif$ [NC]
   RewriteRule \.(jpe?g|gif|bmp|png)$ http://www\.vash-site\.com/images/chtobtytakzhil\.gif [L]

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

Поэтому смело добавляем все те домены, где вы хотели бы иметь возможность лицезреть свою графику подгруженную по хотлинку. Код запрета hotlink в результате может выглядеть так:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?vash-site.ru [NC]

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yandex.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?subscribe.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?feedburner.com[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mail.ru [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?poisk.ru [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?rambler.ru [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?nigma.ru [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ask.com [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?qip.ru[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ukr.net[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?conduit.com[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?tut.by [NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?bing.com[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?webalta.ru[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yahoo.com[NC]
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?conduit.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|mp.3)$ — [NC,F,L]

Существуют и альтернативные варианты, которые вы можете нагуглить, но главное, чтобы работало. Проверить можно, например, открыв свою RSS ленту на Фидбернере и не увидеть там картинок.

Используем SSH-клиент PuTTY и редактор GNU Nano


У меня, к сожалению, все описанные выше способы борьбы с Хотлинкингом не сработали по причине того, что окромя Apache на моем сервере установлен еще и nginx, поэтому все написанное в .htaccess для работы с медиа файлами попросту игнорируется. Есть выход из этой ситуации, но для меня он оказался довольно-таки нервозатратным, ибо пришлось подключаться к серверу по SSH с помощью PuTTY и редактировать содержимое файла конфигурации nginx.

Узнать о том, что у вас установлен nginx, можно разными способами (от хостера, например), но есть и такой способ, который позволит это определить и для сторонних сайтов. Я говорю о плагине для Гугл Хрома под названием Wappalyzer:

Звучит устрашающе, а на деле выглядит еще страшнее, но в конечном итоге задачу запрета Hotlink в nginx мне решить удалось. Естественно, что решение уже имелось — главной проблемой было воплотить его в жизнь, ибо на сайтах сисадминов написано все настолько кратко и сжато, что у меня просто не хватало духу ринуться в пучину и начать во всем этом досконально разбираться.

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

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

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

По аналогии с ФТП имеют место быть SSH-клиенты. Лично я использовал PUTTY. Работает эта программа без установки — достаточно будет просто распаковать архив и открыть файл \PuTTY-0.63-RU-12\putty.org.ru\PuTTY\PuTTY.exe.

В открывшемся окне вам нужно ввести IP адрес своего сервера и нажать кнопку «Соединиться»:

Узнать IP адрес можно в онлайн сервисах приведенных по ссылке, но проще зайти в панель управления своего хостера, ну или попытать их техподдержку. У меня хостинг называется Infobox и панель управления моим облачных виртуальным выделенным сервером позволяет получить эту информацию на вкладке «Управление VPS»:

Там же, кстати, указан логин и пароль для доступа к этому VPS по протоколу SSH. Куда их вводить?

Ну, после того, как вы нажали на кнопку «Соединиться» в окне программы PuTTY, то ваше воображение сразу же потрясет черный экран аля «командная строка в Виндовс».

Сначала нужно будет ввести логин. Можно его набить на клавиатуре, а можно скопировать в буфер обмена, а потом в этом черном окне кликнуть правой кнопкой мыши и он вставится сразу за зеленым курсором. Жмете на Энтер.

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

После того, как пароль будет принят, вы увидите нечто подобное:

Теперь нам нужно будет открыть файл конфигурации nginx в GNU nano (консольном текстовом редакторе). Для этого нужно ввести следующую команду (можно скопировать ее в буфер и вставить кликом по правой кнопке мыши):

nano /etc/nginx/nginx.conf

Жмете на энтер. Открывайте черное окно на весь экран и наслаждайтесь видом.

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

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

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

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

Прописываем запрет хотлинкинга для nginx


Как я уже сказал, наша задача найти в этом файле упоминание вашего домена, что-то на вроде этого «server_name vash-site.ru». В моем случае данный участок кода располагался на втором экране и выглядел примерно так:

server {
server_name vash-site.ru www.vash-site.ru;
listen 109.120.169.57;
set $root_path /var/www/vash-site.ru;
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
root $root_path;
error_page 404 = @fallback;
}

Теперь давайте посмотрим, собственно, на сам код защиты от hotlink, который нам следует хитрым образом сюда добавить. Помните, как в старых детских журналах были задачки на тему «найди десять отличий»? Вот и я приведу для наглядности этот же фрагмент кода, но уже с блокировкой хотлинков:

server {
server_name vash-site.ru www.vash-site.ru;
listen 109.120.169.57;
set $root_path /var/www/vash-site.ru;
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {

root $root_path;

valid_referers none blocked mirvkartinkah.ru *.mirvkartinkah.ru;
if ($invalid_referer) {
return 403;
}
error_page 404 = @fallback;
}

Нашли отличия? Получается, что между строками root $root_path; и error_page 404 = @fallback; мы добавили фрагмент для блокировки Hotlinking:

valid_referers none blocked mirvkartinkah.ru *.mirvkartinkah.ru;
if ($invalid_referer) {
return 403;
}

После этого всем сайтам, которые не являются вашими вместо графики и прочих статических файлов форматов jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf, будет отдаваться 403 ошибка (доступ запрещен), а браузер будет отображать пустую картинку.

В принципе, можно было бы использовать и более расширенный вариант кода, чтобы передать на картинке-заглушке всю гамму ваших эмоций по отношению к копипастерам:

location ~* ^.+\.(jpg|jpeg|gif|png)$ {
     root /path/to/root;
     valid_referers none blocked server_names ~\.vash-site\. ~\.vash-site2\.;
     if ($invalid_referer) {
       rewrite ^ /chtobtytakzhil.gif last;
     }
   }
   location /chtobtytakzhil.gif {
     root /path/to/chtobtytakzhil;
   }

Здесь показано, что можно блокировать хотлинкинг только, например, для графических файлов jpg|jpeg|gif|png, а так же то, что сайтов, где блокировка хотлинка действовать не будет, можно добавить несколько (в строке valid_referers none blocked server_names). Как я понял, заглушка chtobtytakzhil.gif должна будет валяться в корне сайта.

Если, например, у вас все же есть изображения, которые вы хотите разрешить тянуть с вашего сервера (например, кнопку «Я люблю vash-site.ru» в разных цветовых комбинациях), то просто добавьте под приведенным кодом еще такую конструкцию:

location ~* ^.+\.(jpg|jpeg|gif|png)$ {
root /path/to/root/knopki;
}

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

Лично я ничего разрешать не стал, да и заглушку считаю ненужным выпендрежем, ибо ее подгрузка все равно может создавать дополнительную нагрузку на сервер. Достаточно будет и 403 ошибки. Ну, а вот дополнительные сайты в «белый список хотлинка» (строка valid_referers) я бы добавил, чтобы получилось примерно так:

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {

root $root_path;

valid_referers none blocked server_names ~(vash-site|yandex|google|yahoo|bing|facebook|subscribe|feedburner|mail|rambler|nigma|ask|qip|bing);
if ($invalid_referer) {
return 403;
}
error_page 404 = @fallback;
}

Реферер — это указание в http запросе источника, с которого он поступил. Допустил, сайт копипастера хочет подгрузить к себе картинку с вашего сервера, но при этом в заголовке запроса будет указан реферер в виде адреса страницы сайта копипастера, куда он ее хочет вставить (в смысле картинку).

Благодаря написанному регулярному выражению, все сайты, в Урлах которых имя сервера совпадает со словами указанными через вертикальную черту, получат возможность обойти блокировку хотлинков. Что нам и требовалось реализовать. Поздравляю.

Осталось только вставить этот код в консольный редактор Nano. Как открывать на редактирование конфигурационный файлик nginx мы уже рассмотрели чуть выше. Теперь стрелочками подгоняете зеленый курсор к началу того фрагмента в коде, который требуется заменить.

С помощью Del на клавиатуре стираете его, а потом копируете в буфер обмена их Нотепеда уже новый фрагмент с кодом блокировки хотлинков и списком реферов, на которых эта блокировка распространяться не будет.

Переходите в Nano и нажимаете сочетание клавиш Shift+Insert. Данный фрагмент вставится сразу за курсором, но все равно внимательно просмотрите код на предмет закравшейся ошибки (семь раз отмерь).

Вот когда убедитесь, что все в ажуре, то жмакаете находясь в Nano на Crtl+O (это латинская буковка O, а не ноль). Соглашаетесь с сохранением произведенных изменений все в тот же самый файлик nginx.conf и жмете на Enter.

После этого выходите из редактора Nano, нажав на сочетание клавиш Crtl+X. В открывшейся командной строке просите (вежливо) nginx перегрузиться, введя такую вот команду и нажав на Enter:

/etc/init.d/nginx restart

Вот и все. Идете на сайт и проверяете корректность подгрузки картинок. Потом идете на сайт копипастера (если знаете такового) и проверяете работу блокировки хотлинков на его ресурсе — графика с вашего сервера подгружаться не должна.

Ну, а потом открываете свою RSS ленту и убеждаетесь, что там (на фидбернере) фотки прекрасно подгружаются. Что и требовалось реализовать. Спасибо за внимание.

Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru

Еще:

Рубрики :Инструменты вебмастера

Комментарии и отзывы

Сергей

Блин, очень сложно что касается Nginx...

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

Может ваш вариант тоже не подходит для виртуального хостинга? У вас наверняка VDS или VPS.

Дмитрий

Сергей: нет, у меня Linux VPS-2048 (в облаке, правда) и на нем живут два моих сайта. Описанный выше фрагмент блокировки хотлинка я добавлял только к одному сайту (у второго чуть выше по коду файла конфигурации энджин икс была схожая запись, но туда я ничего не добавлял и хотлинкинг с него возможен). К сожалению, я далек от области администрирования серверов и могу описать только то, что делал и что получилось. Спасибо.

Валерий Абашкин

Дмитрий, все настолько сложно, что мои мозги ничего не в состоянии воспринять. Китайская грамота для новичков. Видимо, я еще не созрел до таких нюансов сайтостроения. Возможно, в будущем я подучусь и вернусь к этой теме. В любом случае, Вам спасибо! Статья найдет своего читателя.

Удачи Вам и всех Благ!

Дмитрий

Валерий Абашкин: очень даже Вас понимаю, но по неволе пришлось лезть в эти дебри.

Андрей

Здравствуйте, Дмитрий! Что-то давно вы не писали статей на тему: «Как я провёл это лето, точнее год». Было бы интересно почитать.

Іван

Хм. nano это еще самый интуитивный редактор, вы еще не видели vi

wartandax

Здравствуйте! Зашёл по SSh, но не пойму где искать код, в каком файле?

Дмитрий

А как с видео быть в location в список добавлены и mp4|MP4 на всякий случай а все равно грузится у сайта вора. Картинки перестали.

Андрей

A как можно сделать, чтобы картинки с моего сайта на чужом сайте показывались с водяный знаком? Есть сайты, которые содержат картинки без вод. знака, но в поиске картинок Google они все с водяным знаком.Как можно такое реализовать?

Дарья

Спасибо за статью, внедрила на своем сайте!

а это не повредит seo? поисковики смогут нормально индексировать картинки?

Михаил

Дмитрий, спасибо за пост. А не подскажете — Как в htaccess реализовать то же самое, но не с «белым списком», а с «черным»? Т.е. как указать именно список сайтов, хотлинкинг с которых запрещен?

Подписаться не комментируя