Для отсеивания ботов, агрессивно [[https://www.opennet.dev/opennews/art.shtml?num=62925 индексирующих]] контент, игнорируя правила из robots.txt, можно воспользоваться тем, что многие боты запрашивают заранее предопределённый набор страниц и не передают Cookie, выставленные в ответ на прошлые запросы. Идея в том, чтобы при поступлении запроса проверять наличие определённой Cookie и если она отсутствует вместо запрошенного контента отдавать HTML-заглушку, возвращающую JavaScript-код для выставления Cookie и перенаправления пользователя на ту же страницу. При отправке запроса из браузера при первом входе запрос незаметно для пользователя будет проброшен через код установки Cookie. В промежуточном ответе используем код
ошибки HTTP [[https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/... 418]], информирующий о нежелании обрабатывать автоматизированные запросы.
Предложенный метод не отсеивает всех ботов, но проще в настройке и менее назойливый для посетителей, чем применение системы защиты от ботов [[https://github.com/TecharoHQ/anubis Anubis]], допускающей вход только после подбора на языке JavaScript значения, хэш SHA-256 от которого в сочетании с выданной сервером строкой содержит определённое число лидирующих нулей (данная задача требует ресурсов CPU для решения, но не требует ресурсов для проверки).
Пример для http-сервера Caddy:
example.com {
# Проверка всех запросов на наличие Cookie "verified"
@unverified not header Cookie *verified*
# JavaScript-код, выдаваемый для запросов без Cookie "verified"
handle @unverified {
header Content-Type text/html
respond <<EOF
<script>
setTimeout(() => {
document.cookie = 'verified=1; Path=/;';
window.location.reload();
}, 1000);
</script>
EOF 418
}
# Нормальное проксирование остальные запросов
reverse_proxy localhost:3001
}
Пример для nginx:
location / {
if ($cookie_verified = "") {
add_header Content-Type text/html;
return 418 '<script>setTimeout(() => {document.cookie = 'verified=1; Path=/;';window.location.reload();}, 1000);</script>';
}
....
}
URL: https://fxgn.dev/blog/anubis/
Обсуждается: http://www.opennet.dev/tips/info/3287.shtml