mod_setenvif и защита от хотлинкинга

Wikipedia дает такое определение хотлинкингу:

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

Как от него защититься?

Первый способ, который приходит в голову – использование mod_rewrite. Получается примерно так:


RewriteEngine On
RewriteBase /
# Steal protect
RewriteCond %{HTTP_REFERER} !avtobeginner\.ru
RewriteRule \.(jpe?g|gif|bmp|png)$ dnts.gif [L]

В результате, если HTTP_REFERER не содержит avtobeginner.ru – показывается картинка dnts.gif

При таком подходе существуют два недостатка:

  • Из-за использования mod_rewrite при обработке запроса с чужого домена происходит 2 запроса: сначала исходного файла, потом «специальной» картинки.
  • Т.к. отдается специальная картинка – траффик (а он у некоторых хостеров бывает платным) все равно расходуется.

На выручку приходит модуль mod_setenvif. Он позволяет задавать переменные окружения в зависимости от запроса.

Для защиты картинок пишем так:


SetEnvIfNoCase Referer "^http://avtobeginner.ru" local_ref=1
SetEnvIfNoCase Referer "^http://www.avtobeginner.ru" local_ref=1

Order Allow,Deny
Allow from env=local_ref

Таким образом мы разрешаем доступ к картинками (по маске [можно добавить и другие типы файлов]) только «локально». Запрос считается «локальным» если пришел с домена, содержащего avtobeginner.ru. Все остальные увидят 403 Forbidden.

3 комментария on "mod_setenvif и защита от хотлинкинга"

  1. Респект замечательная заметочка!

  2. Knave:

    Кстати, всплыл один неприятный момент.

    В спецификации RSS есть непарный тег enclosure, в котором можно указывать адресс различных медиа-ресурсов, например, картинки, связанной со статьей.

    А т.к. картинка тянется «не локально» – то apache говорит «Ахтунг» и закрывает доступ.

    Вот.

  3. хмм, за два года изменился синтаксис .htaccess ? у меня данноу вырожение не пашет, уже как только не менял – на работает и всё тут(

Got something to say? Go for it!