Pull to refresh

Comments 39

Я бы менял юзерагент только в рамках текущего браузера, т.е. не показывал бы, к примеру, юзерагент Google Chrome, используя при этом Internet Explorer. Иначе возможна ситуация, что некоторые сайты будут работать некорректно. У браузеров отличается поведение в некоторых ситуациях и некоторые сайты учитывают эти нюансы в своей работе.
Так настраиваемо же.

Спасибо за расширение!
Также существуют сайты, которые привязывают сессию пользователя к юзерагенту. Переавторизовываться каждые n минут не очень-то весело. Поддерживают ли подобные расширения для браузеров список сайтов-исключений?
Народ, а объясните мне пожалуйста, зачем это нужно делать? У нас в России же скрывай или не скрывай, если сильно захотят посадить — посадят. И более того, я не понимаю что и зачем скрывать? Все занимаются какой то преступной деятельностью?
Где-то на хабре встретил фразу: Мне нечего скрывать, но это не ваше дело.
А ещё я где-то видел, «не все тут из России».
Скрывать не от спецслужб, а от всяких рекламных сервисов и прочих трекингов, которые используют в том числе и UA+IP+еще кучу нетрадиционных методов, типа проверки закешированности файла, localStorage и прочая…
Угу, скрыл)) А через javascript мы выявляем несоответсвие UA и к этому пользователю приглядываемся более внимательно))
Да, "navigator.userAgent is a read-only property". Можно делать inject для подмены, но этот метод не очень нравится, я ещё подумаю как это можно обойти
console.log(navigator.userAgent);
navigator.__defineGetter__('userAgent', function(){return 'bla bla bla';})
console.log(navigator.userAgent);


п.с. аналогично можно и document.referrer подменять и т.п.
Спустя довольно значительное время на изучение темы, пришел к выводу — заменить UA на фейковый, попутно подменив «navigator.plugins» и прочее можно, выполнив одну единственную инъекцию js-кода до обработчика window.onload. То есть, если мы в манифесте укажем конструкцию вида:

manifest.json
/* ... */
  "content_scripts":[  
    {  
      "all_frames":true,
      "js":["content.js"],
      "matches":[  
        "http://*/*",
        "https://*/*",
        "file:///*" /* для теста на локальных файлах */
      ],
      "run_at":"document_start"
    }
  ]
/* ... */

А в «content.js» вставим нашу инъекцию:

content.js
/* original source from : http://goo.gl/LWICQR */
/* idea author: http://stackoverflow.com/users/938089/rob-w */
function setupUserAgentHook(UserAgent){
    if(typeof UserAgent !== 'string' && UserAgent == '')
        return false;

    function addslashes(str) {	// Quote string with slashes
    	return str.replace(/([\"\'])/g, "\\$1");
    }

    var actualCode = '(' + function(newUserAgent){
        'use strict';
        var navigator = Object.create(window.navigator);
        Object.defineProperties(navigator, {
            userAgent: {
                value: newUserAgent,
                configurable: false,
                enumerable: true,
                writable: false
            },
            appVersion: {
                value: newUserAgent,
                configurable: false,
                enumerable: true,
                writable: false
            },
            platform: {
                value: 'Win32',
                configurable: false,
                enumerable: true,
                writable: false
            },
        });
        Object.defineProperty(window, 'navigator', {
            value: navigator,
            configurable: false,
            enumerable: false,
            writable: false
        });
    } + ')("'+addslashes(UserAgent)+'");';
    
    //console.log(actualCode);
    
    document.documentElement.setAttribute('onreset', actualCode);
    document.documentElement.dispatchEvent(new CustomEvent('reset'));
    document.documentElement.removeAttribute('onreset');
}

setupUserAgentHook('Hell Yeah!');


То всё замечательно и все довольны. Но. Есть одно но. Нужно получить от «background.js» данные — какой UA ставить. Это можно сделать через «chrome.runtime.onMessage» — передать сообщение, можно через «chrome.tabs.executeScript» — выполнить что то в духе «var UA='Bla-Bla';», но эти функции работают в потоке, и результат приходит после window.onload. Замечательная многопоточность яваскиптов тут стала как кость в горле, как решить эту задачу — ума не приложу. Если есть идеи — буду чертовски признателен.
Владельцам Firefox рекомендую обратить внимание на Random Agent Spoofer. Помимо смены юзер-агента он умеет анонимизировать пользователя по другим признакам.
Скрытый текст
Интересно. Не замечал ещё один канал утечки — WebGL, а через него можно вытащить некоторую инфу о видеокарте.
В яндексе вас забанят за странное поведение
На самом деле, не только в яндексе. Доблестные защитники сайтов от DDoS часто привязываются к ip + UA (покуда зачастую больше информации об одном пользователе для его идентификации не получить), и ip, с которого каждый раз ходит уникальный UA попадет под подозрение. В штатном режиме ничего не будет, однако при обнаружении атаки определенного типа можете попасть под нож (хотя это все зависит от конкретных алгоритмов отсева).
Т.е. лучше будет, если на один сайт вы будете ходить с одним UA, на другие — с случайным, но тоже фиксированным в рамках сессии.
Если на то пошло, то из объекта navigator надо подменять инфу об установленных плагинах. Комбинация их версий + ip даст не худший уникальный слепок, чем c UA. Хотя, идея рандомизации мне нравится, спасибо за плагин.
Отлично, спасибо за наводку, я поработаю над этим
Интересный плагин для Chrome. А вот для Firefox знаю штуку помощнее, называется Secret Agent: www.dephormation.org.uk/index.php?page=81
Позволяет не только подменять UA, но и также настраивать accept headers и некоторые другие параметры для усложнения снятия fingerprint-a, настраивать уровень энтропии и как бонус — выявлять попытки хайджека HTTP-запросов с редиректом на другой ресурс. И всё это очень гибко конфигурируется, в т.ч. наличиствует белый список ресурсов.
Хотите пример? Вот вам 10 UA браузера «IE 9», и среди них пять настоящих. Сможете отличить?

Легко!

Фейковые UA

Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 6.0; Win64; x64; Trident/5.0; .NET CLR 3.8.50799; Media Center PC 6.0; .NET4.0E)
Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 8.1; Trident/5.0; .NET4.0E; en-AU)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 8.0; WOW64; Trident/5.0; .NET CLR 2.7.40781; .NET4.0E; en-SG)
Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 8.0; Win64; x64; Trident/5.0; .NET4.0E; en)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.0; Trident/5.0; .NET CLR 2.2.50767; Zune 4.2; .NET4.0E)

Реальные UA

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0
Зачем вообще генерить УА, которые однозначно определяются как фейк? Даже человек отличает, а робота и подавно научат.
«Определяется как фейк» !== «Раскрыть настоящий»
«Если человек отличает» !== «Обучить робота тривиальная задача»
Хм, а так сможете отличить? Не подглядывая в исходники:

Mozilla/5.0 (Windows NT 8.1) AppleWebKit/536.21 (KHTML, like Gecko) Chrome/32.0.2018.39 Safari/536.21
Mozilla/5.0 (Windows NT 7.1; WOW64) AppleWebKit/536.12 (KHTML, like Gecko) Chrome/31.0.2043.42 Safari/536.12
Mozilla/5.0 (Windows NT 7.0; Win64; x64) AppleWebKit/536.25 (KHTML, like Gecko) Chrome/37.0.2035.63 Safari/536.25
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.34 (KHTML, like Gecko) Chrome/33.0.2004.50 Safari/536.34
Mozilla/5.0 (Windows NT 7.0) AppleWebKit/537.33 (KHTML, like Gecko) Chrome/34.0.2045.76 Safari/537.33
Mozilla/5.0 (Windows NT 7.0; Win64; x64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/32.0.2005.16 Safari/537.15
Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/37.0.2031.16 Safari/537.16
Mozilla/5.0 (Windows NT 8.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/34.0.2025.99 Safari/537.17
Mozilla/5.0 (Windows NT 7.1; Win64; x64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/33.0.2010.94 Safari/537.22
Mozilla/5.0 (Windows NT 8.1; WOW64) AppleWebKit/537.37 (KHTML, like Gecko) Chrome/37.0.2039.96 Safari/537.37

(напомню, у нас на данный момент 19 различных браузеров имитируется, суммарно выбор довольно большой получается)
у chrome слишком много версий, чтобы мой метод сработал также хорошо как на определении фейковых UA для IE.

Дело в том, что у меня есть доступ к архивам логов одного достаточно посещаегого сайта, в логах есть информация про UA пользователя, я просто прогнал грепом ваши UA по записям в логах. Если совпадений не находилось то я считал такие UA фейковыми.

«Если человек отличает» !== «Обучить робота тривиальная задача»


Для chrome это просто так не сработает, так как у них часто меняются версии. Но если есть доступ в большому объему логов, то вычислить фейковый UA также не составит проблем.
А где гарантия, что на сайт не заходили пользователи c расширением, генерирующим фейк-UA? Их UA запишется в лог и станет для вас настоящим.
hint: А каков процент посетителей с фейковым UA и с настоящим UA?
Методика же — просто сделать grep и проверить, что такой UA есть в логах. О подсчёте количеств ничего не говорилось ))
Хм, а так сможете отличить? Не подглядывая в исходники:
(напомню, у нас на данный момент 19 различных браузеров имитируется, суммарно выбор довольно большой получается)


Кажется вы решили дать мне задачку в которой нет правильного ответа, сдается мне что все UA фейковые, нет?
Это и есть правильный ответ, а метод грепа каждого UA по значительному объему логов — метод конечно мощный, но требует ресурсов. Если сайт обрабатывает, скажем, 100000 запросов в час (напомню, считается любой запрос в этом случае) — это 100000 грепов в час по большим логам. Можно конечно все повторяющиеся UA грохнуть и кешить запросы — но это уже отдельная история.
Есть желание написать пост про «Долой анонимность — вычисляем фейковый UA?» :)
:) чукча не писатель, чукча читатель, статьи не будет.

а метод грепа каждого UA по значительному объему логов — метод конечно мощный, но требует ресурсов


100 тыс запросов в час это чуть больше 1го запроса в секунду. предположим что валидных UA около 10 тыс, поиск по 10 тыс строк занимает гораздо меньше секунды. Поэтому если кому-то это нужно, то это можно реализовать за нескольков часов на простеньком VPS.

как я уже сказал UA chrome детектировать по логам мне было сложно, но я поступил проще, я проверял только версии chrome (31.0.2043.42) в логах :)

UPD. Да, чуть не забыл — что делать с тем, что фейковый UA будет идентифицирован? И через 5 минут (по дефолту) он будет уже сменен, а если есть несколько посетителей «под подозорением» — как идентифицировать каждого?
Set-Cookie: suspicious_ua=1 expires=Fri, 31 Dec 2099 23:59:59 GMT; path=/; domain=.example.net
UFO just landed and posted this here
UFO just landed and posted this here
Это было бы актуально, если за 100 юзверей 90 пользовались бы этим плагином с указанной вами конфигурацией.
Разные алгоритмы используют разные методики определения, и дабы большинство «прокатило» — необходимо делать максимально подобный.
У chromium (и chrome тоже, я думаю) есть опция командной строки: --user-agent
$ chromium --user-agent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0'
Без = не работает.

Можно засунуть желаемый список агентов в текстовый файл и выбирать случайный при запуске:
$ chromium --user-agent="`shuf user-agents.txt | shuf | head --lines=1`"

К сожалению, у Firefox такой опции не нашел.
См. статью Немножко анонимен.
Скрыть реальный IP — используем разные VPN сервера, отключить львиную долю отслеживающих скриптов — Adblock Plus и Ghostery, убрать Referer — не вопрос, что то ещё забыли… Ах да
… размер и глубину цвета экрана, шрифты (отпечаток по Canvas), временную зону и язык, отклонение времени от точного времени, пинг, локальный адрес и адреса других устройств (WebRTC) и так далее.

Проверьтесь на panopticlick.eff.org Набрали 20 бит? А ведь там зверства вроде WebRTC- и Canvas-фингерпринтинга не используются.

Но это всё полумеры, на самом деле нужно как минимум Tor Browser использовать, там многое уже исправлено. Если ресурсы позволяют, то внутри Whonix.
Sign up to leave a comment.

Articles