Что такое JavaScript-проверка браузера
Содержание
Поделиться
JavaScript-проверка браузера — это код, который выполняется у клиента и смотрит на среду страницы, а не только на заголовки запроса. В Метрике отсутствие JavaScript разобрано отдельным правилом отчёта «Роботы», и оно не сводится к фразе «нет скрипта — значит робот». Скликивание по одному факту «JavaScript не выполнился» эти страницы не объявляют.

В отчёте «Роботы» есть правило «Отфильтрованы по отсутствию JS и Referer»: у визита не было JavaScript и не было Referer у картинки в noscript. Справка разбирает его так. Код счётчика состоит из JavaScript и невидимой картинки в noscript. Если JavaScript выключен или не поддерживается, сведения о просмотре уходят в заголовке Referer, когда грузится эта картинка. Если заголовок не пришёл, Метрика считает просмотр роботным. Это одно именованное правило отчёта. Поведенческие правила та же страница по-прежнему не расшифровывает.
Нет JavaScript само по себе в этом правиле недостаточно: смотрят ещё Referer картинки в noscript. Просмотр становится роботным, когда не было ни скрипта, ни этого заголовка.
Активный съём идёт кодом, пассивный — из запроса
Заметка W3C делит съём на пассивный и активный. Пассивный читает то, что и так лежит в запросе, без кода у клиента: cookie, набор заголовков HTTP, адрес и прочие сетевые данные. В пример пассивного канала поставлен User-Agent: он обычно называет браузер, движок, версию и операционную систему. Активный запускает на клиенте JavaScript или другой код. Заметка пишет, что приёмы на CSS уже догоняют JavaScript. В примеры активного съёма входят размер окна, перечисление шрифтов и подключённых устройств, замер производительности, датчики и отрисованные узоры.
Активный съём в принципе заметен на клиенте. Черты чаще уезжают на сервер пачкой, и сервер складывает их уже незаметно для страницы. Перечень — иллюстрация классов, не список полей, по которым принимают решение о визите. JavaScript-проверка относится к активному классу: код выполняется у клиента. Пассивный заголовок её не заменяет и сам списком полей решения не является.
Headless это не отменяет. Справка флагов Headless отличает --dump-dom от скачивания HTML, как это делает curl. Чтобы напечатать DOM, Chrome сначала разбирает HTML, выполняет скрипты, которые могут его изменить, и только потом сериализует результат. Это описание штатного флага, не список признаков, по которым визит считают автоматическим. Клиент, который выполняет скрипты страницы, уже не равен загрузке исходника. Выполнение JavaScript поэтому не доказывает, что за страницей человек: headless тоже выполняет скрипты, прежде чем отдать DOM.
Задача в браузере — не запрет визитов без скрипта
Памятка OWASP описывает приём, при котором клиенту дают криптографическую или proof-of-work задачу, чтобы растянуть время атаки. Приём не требует человека в цикле и ограничивает частоту конкретной реализации клиента. OWASP отдельно предупреждает, что запрет визитов без JavaScript ухудшает доступность, в том числе для скринридеров. Это описание защиты входа, не параметры задачи Binetro. Параметры задачи продукта здесь не публикуются.
Запрет «нет JavaScript — не пускать» и вычислительная задача — разные приёмы. Первый OWASP связывает с потерей доступности. Второй не требует человека в цикле и бьёт по частоте конкретной реализации клиента. Правило Метрики про отсутствие JS и Referer — третье: оно помечает просмотр роботным в отчёте, когда не пришли ни скрипт, ни Referer картинки, и параметры задачи Binetro не задаёт.
Решение по визиту собирается из нескольких независимых наблюдений: поведение на странице, окружение браузера, сеть и адрес, частота запросов и параметры рекламного перехода. Одно наблюдение не знает о правилах остальных. Состав полей, баллы и правила отдельных проверок не публикуются. То, что JavaScript увидел в окне или в шрифтах, — одно наблюдение. Оно не знает, что решили сеть, частота и параметры перехода.
Недействительный клик не равен строке «нет JavaScript» в отчёте роботов. Вернёт ли Яндекс деньги, это правило не обещает. Кто кликает без покупки, — в статье о том, кто скликивает рекламу. Разница терминов — в статье про кликфрод и скликивание.
JavaScript-проверка смотрит среду у клиента и в принципе заметна на нём. В Метрике роботным просмотр считают, когда нет и скрипта, и Referer картинки в noscript. Выполнение скриптов headless не делает визит человеческим. Одно наблюдение решение не выносит.