Защита сайта от Хотлинк на сервере NGINX
Раздел(ы): Вебмастеру
Просмотры: 1427
Комментарии: 0
Это обновленная версия статьи о защите от хотлинка — https://moonback.ru/page/nginx-hotlink-protection.
Напомню. Хотлинк (англ. hotlink) — это включение в веб-страницу файлов-изображений или других ресурсов с чужого сервера.
Владелец сайта может бороться с этим позорным явлением, проверяя переменную HTTP_REFERER (она содержит адрес источника запроса). Если HTTP_REFERER не совпадает с именем вашего сайта, то посетителю будет ограничен доступ. В моем примере браузер посетителя получит ошибку 403 и запрошенное изображение не будет отображено.
Хотлинкинг — популярная практика контент-воров. Она предполагает использование чужих изображений и пропускной способности чужого сервера для показа этих изображений на своём сайте.
При желании вы можете заменить все отдаваемые посетителю изображения на самый маленький по размеру gif-файл размером 1×1 пиксель или файл с надписью, что данная картинка была украдена с оригинального сервера, и т. п. Подробнее о таком варианте я написал в этой статье — https://moonback.ru/page/site-protection, когда столкнулся жестким хотлинком всего сайта.
Защита от Hotlink в NGINX
Эта инструкция подойдет для владельцев выделенных и виртуальных серверов которые используют NGINX в качестве FrontEnd. Чтобы настроить защиту от Хотлинк вам нужно добавить следующие строки в файл конфигурации nginx.conf:
location ~* ^.+\.(webp|jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar|swf|ico)$ { valid_referers none blocked domain.tld ~\.google\. ~\.yandex\.; if ($invalid_referer) { return 403; } }
В строке location нужно указать перечень расширений файлов которые мы защищаем от хотлинка. Я написал все популярные форматы изображений, аудио, видео, архивов, а так же JavaScript и файлы стилей,
В строке valid_referers нужно перечислить домены на которые не распространяется блокировка.
При этом,
- none — поле «Referer» в заголовке запроса отсутствует;
- blocked — поле «Referer» в заголовке запроса присутствует, но его значение удалено межсетевым экраном (firewall) или прокси-сервером. К таким значениям относятся строки, не начинающиеся на «http://» или «https://».
Оба этих значения none и blocked лучше использовать. Хуже не будет, во всяком случае, жуликам они жизнь точно не облегчат. При этом их наличие поможет избежать ложные срабатывания.
Вместо domain.tld укажите свой сайт (доменное имя).
Значения ~\.google\. и ~\.yandex\. разрешают доступ поисковым системам Google и Яндекс к вашим статическим файлам (изображения, стили, архивы, видео). Это регулярное выражение. В начале должен быть символ «~». На совпадение с выражением будет проверяться текст, начинающийся после указания типа протокола «http://» или «https://».
Встроенная переменная $invalid_referer равна пустой строке, если значение поля «Referer» заголовка запроса считается правильным, иначе — «1».
Выглядеть этот код в вашем файле конфигурации NGINX должен примерно так:
100% защиты от хотлинк не существует
Следует иметь в виду, что подделать запрос с нужным значением поля «Referer» не составляет большого труда, поэтому цель использования данного способа защиты от хотлинка заключается не в стопроцентном блокировании подобных запросов, а в блокировании массового потока запросов, сделанных обычными браузерами.
Нужно также учитывать, что обычные браузеры могут не передавать поле «Referer» даже для верных запросов.
Благодарности
При написании статьи были использованы следующие источники: