Главная » Хабрахабр » [Перевод] Функция 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 Интересное!

Нечеткая логика против ПИД. Скрещиваем ежа и ужа. Авиадвигатель и алгоритмы управления АЭС

Нет ли здесь обмана? Наверное, у каждого, кто изучал теорию автоматического управления, в душе не раз появлялись сомнения, каким образом эти два, три или даже десять квадратиков передаточных функций в модели, представляют собой динамику сложного агрегата, типа ядерного реактора или ...

Путь интроверта в карьере и бизнесе

Это откровенная статья дизайнера-интроверта, где я делюсь своей историей карьерного пути с выводами и цифрами моих доходов. Все как вы любите. Здесь будет только личный опыт, возможно, он кому-то будет полезен, а может и нет. Меня зовут Сергей Захаров. Начну ...