Главная » Хабрахабр » [Перевод] Функция random() у гуглобота работает абсолютно детерминированно

[Перевод] Функция random() у гуглобота работает абсолютно детерминированно

Я проводил некоторые эксперименты, как Googlebot разбирает и рендерит JavaScript, и наткнулся на несколько интересных вещей. Первое — то, что функция Math.random() в Googlebot выдаёт полностью детерминированные серии чисел. Я написал маленький скрипт, который использует этот баг для точной идентификации гуглобота:


Источник

При первом вызове Math.random() из гуглобота результат всегда будет 0,14881141134537756, второй вызов всегда вернёт 0,19426893815398216. Скрипт по ссылке выше просто использует эту информацию для идентификации бота Google, хотя немножко обфусцирует свои действия, чтобы они не выглядели слишком произвольными.

Представьте объём работы, которую необходимо выполнить Google, чтобы обойти весь веб, да при этом ещё выполнить все скрипты. Здесь не обойтись без обильных оптимизаций, и я полагаю, что детерминированные случайные числа реализованы по следующим причинам::

  1. Скорость.
  2. Лучшая безопасность.
  3. Предсказуемость — гуглобот может быть уверен, что страница отобразится одинаково при каждом визите.

Ускорение времени…

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. Но может быть такой способ позволит сделать нечто, правдоподобно отрицая свою вину!


x

Ещё Hi-Tech Интересное!

Профессиональные навыки, востребованные среди UX-специалистов (срез 2018)

С 29 августа по 07 сентября 2018 сообщество UX SPb (независимое сообщество UX-специалистов Санкт-Петербурга) проводило опрос, направленный на изучение профессиональных навыков специалистов по пользовательским интерфейсам. Сообщество обещало опубликовать результаты. Обещание исполнено 🙂 В исследовании приняли участие 109 респондентов. Опрос проводился ...

От антикварного радио до DIY-колонок: 12 каналов на YouTube про устройство акустики

Сегодня мы подготовили подборку YouTube-каналов, авторы которых рассказывают об устройстве винтажного и современного аудиооборудования: от настройки виниловых проигрывателей до сборки акустических систем. Всех, кому это интересно, приглашаем к просмотру под кат. Фото Nathan Duprey / CC Канал посвящен сборке акустических ...