Каждый владелец сайта понимает, что уникальный качественный контент это не только залог интереса пользователей, но еще и благосклонность поисковых систем. Очень обидно, когда этот контент зачастую с трудом добытый, иногда и стоящий много денег, попросту кто-то копирует. Резонно возникает вопрос как защитить контент сайта от копирования.
Для начала определимся как такое копирование происходит. В редких случаях кто-то сидит и копирует вручную материалы с вашего веб сайта. Это дела поручают роботам ботам. Вот как раз от них и можно настроить конфигурацию на сервере и защитить сайт от копирования.
Интернет магазины работают на веб сервере, построенном по разным технологиям, это может быть связка nginx+apache или nginx+php-fpm, даже обычный apache. По статистике все же nginx используется в большинстве случаев. Таким образом рассмотрим как защитить сайт от ботов на основе конфигов nginx.
Составляем белый список IP адресов для поисковых систем
geo $whitelist { default 0; # ip server 155.551.155.155 1; # боты yandex 77.88.0.0/18 1; 87.250.224.0/19 1; 93.158.0.0/16 1; 95.108.128.0/17 1; 213.180.192.0/19 1; 141.8.0.0/16 1; 130.193.0.0/16 1; 5.255.253.0/24 1; 178.154.0.0/16 1; # боты google 64.68.80.0/21 1; 64.233.0.0/16 1; 66.102.0.0/20 1; 72.14.192.0/18 1; 209.85.128.0/17 1; 216.239.32.0/19 1; 66.249.0.0/16 1; # mail.ru 217.69.0.0/16 1; 94.100.0.0/16 1; # bingbot-msn 40.77.0.0/16 1; 207.46.0.0/16 1; 65.52.0.0/14 1; 157.55.0.0/16 1; # Yahoo 68.180.0.0/16 1; 67.195.0.0/16 1; 69.147.64.0/18 1; 72.30.0.0/16 1; 74.6.0.0/16 1; # sputnik 5.143.0.0/16 1; }
Далее пишем конфигурацию, которая будет блокировать ботов и разрешать боты поисковых систем, которые мы определили выше по HTTP/1.1.
map "$whitelist:$server_protocol" $limit1 { "1:HTTP/1.0" ""; "1:HTTP/1.1" ""; "1:HTTP/2.0" ""; "0:HTTP/1.1" "$binary_remote_addr"; } limit_req_zone $limit1 zone=bot11:10m rate=7r/m;
блокируем других ботов, который выполняют обращение по HTTP/2.0
map "$whitelist:$server_protocol" $limit2 { "0:HTTP/2.0" "$binary_remote_addr"; } limit_req_zone $limit2 zone=vse:10m rate=25r/m;
Выполняем разрыв соединения если бот обращается по HTTP/1.0, и он не из белого списка
map "$whitelist:$server_protocol" $bad_bot { default 0; "0:HTTP/1.0" 1; }
Также выполняем разрыв соединений для различных сканеров и ботов
map $http_user_agent $bad_useragent { default 0; ~*ia_archiver 1; ~*Curl 1; ~*libwww 1; ~*BLEXBot 1; ~*SBooksNet 1; ~*MJ12bot 1; ~*Java 1; ~*NTENTbot 1; ~*GetIntent 1; ~*SemrushBot 1; ~*HybridBot 1; ~*AhrefsBot 1; ~*SeznamBot 1; ~*DeuSu 1; ~*GrapeshotCrawler 1; ~*SentiBot 1; ~*default 1; ~*Virusdie 1; ~*WordPress 1; ~*WhatsApp 1; }
Для каждого хоста указываем следующее
if ($bad_bot) { return 444; } if ($bad_useragent) { return 444; }
Данные лимиты устанавливаются индивидуально для каждого сайта
limit_req zone=bot11 burst=4 nodelay; limit_req zone=vse burst=4 nodelay;
В результате данной конфигурации получаем следующие условия
Если бот обращается по протоколу HTTP/1.0 и его нет в белом списке, то он получит сообщение об ошибке 444 и произойдет разрыв соединения.
Помимо этого есть условие ограничения rate=7r/m, что означает разрешать запросы не чаше 7-ми в минуту. Не перепутайте и не поставьте такое ограничение для картинок, так как загружая страничку, картинок подргужается много и лимит может ограничить это действие.
Так же в случае обращения по протоколу HTTP/2.0 будет выполнятся ограничение с учетом условия не больше 25 запросов в минуту (rate=25r/m).
Все ограничения подбираются индивидуально, исходя из мониторинга и анализа логов работы веб сервера, так же проверки какие адреса попадают в бан.
Команда для проверки логов
cat /var/log/nginx/access.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head
Такой анализ необходим для выявления новых сетей ботов поисковиков.
Нужно защитить сервер от ботов обращайтесь [email protected]