https://habrahabr.ru/post/348914/- Поисковые технологии
- Поисковая оптимизация
- JavaScript
Я проводил некоторые эксперименты, как Googlebot разбирает и рендерит JavaScript, и наткнулся на несколько интересных вещей. Первое — то, что функция
Math.random()
в Googlebot выдаёт полностью детерминированные серии чисел. Я написал маленький скрипт, который использует этот баг для точной идентификации гуглобота:
Источник
При первом вызове
Math.random()
из гуглобота результат всегда будет
0,14881141134537756
, второй вызов всегда вернёт
0,19426893815398216
. Скрипт по ссылке выше просто использует эту информацию для идентификации бота Google, хотя немножко обфусцирует свои действия, чтобы они не выглядели слишком произвольными.
Краулинг в масштабе Google
Представьте объём работы, которую необходимо выполнить Google, чтобы обойти весь веб, да при этом ещё выполнить все скрипты. Здесь не обойтись без обильных оптимизаций, и я полагаю, что детерминированные случайные числа реализованы по следующим причинам::
- Скорость.
- Лучшая безопасность.
- Предсказуемость — гуглобот может быть уверен, что страница отобразится одинаково при каждом визите.
Ускорение времени…
Googlebot также запускает JavaScript с ускоренными часами, что вполне логично. Зачем реально ждать 5 секунд, если ты бот? Так что Google на самом деле запускает таймер в гораздо более быстром темпе. Если создать простой скрипт с тикером и запустить функцию Fetch & Render в консоли Google Search Console, то скрипт выполнится практически мгновенно, но результат будет выглядеть так:
Вторая дата — это дата из будущего! Марти Макфлай мог бы гордиться.
Когда это началось?
Мне стало интересно, обновляется ли генератор «случайных» чисел у Google, но поиск числа
0,14881141134537756
вернул более 18 000 результатов, так что константа кажется довольно стабильной. Обнаружив это, я погуглил ещё немного и нашёл
старый комментарий на Hacker News от пользователя KMag:
В какой-то момент кто-то из SEO выяснил, что random() всегда возвращает 0,5. Не уверен, что кто-нибудь понял, что JavaScript всегда при этом видел какую-то дату из лета 2006 года, но предполагаю, что ситуация изменилась.
Похоже на то, что ситуация сохраняется в течение долгого времени, но раньше
random()
всегда возвращал
0,5
, а сейчас выдаёт детерминированные серии чисел. Дата действительно вначале установлена точно, но затем может идти в будущее. KMag дальше сказал:
Надеюсь, что теперь они установали случайное начальное число и дату, используя криптографический хэш всех загруженных скриптов и текста страницы, так что он будет детерминированным, но им будет сложно манипулировать.
Кажется, этого не произошло. Но я не уверен, что таким образом можно сделать многое из того, что вы не можете сделать с помощью юзер-агента и IP. Но может быть такой способ позволит сделать нечто, правдоподобно отрицая свою вину!