Меня давно уже неприятно удивляла навязчивая реклама Google AdSense, основанная на моих старых поисковых запросах. Казалось бы, после проявленного интереса уже прошло много времени, не один раз были почищены в браузере куки и кэш. Но реклама все равно появляется. Как же им удается все равно получать обо мне информацию? Как выяснилось, для этого существует много способов.
Веб-трекинг или, проще говоря, идентификация и отслеживание пользователей, является не столь сложным действием. Для этого применяется специальный уникальный для каждого браузера идентификатор, который устанавливается на стороне клиента при посещении сайта.
Задумывался этот инструмент для вполне приличных и полезных целей. Например, этот метод помогает отличить живых людей от ботов, посетивших сайт, или определить предпочтения человека, сохранить их и применить при последующих визитах. Но, все имеет две стороны. И веб-трекинг стал удобным инструментом в индустрии рекламы, а началось это еще в середине 90-х.
С того времени изменилось очень многое, развитие технологий позволяет отслеживать пользователей не только по cookie, но и с применением других инструментов. Самый простой вариант отследить пользователя – применить какой-то идетификатор типа тех же «печенек». Также можно пользоваться сведениями браузера, которые они передает при отправке запросов. Там в HTTP-заголовке присутствуют: адрес, установленная на устройстве операционная система, текущее время пользователя и т.д. Кроме того, пользователей можно отличать друг от друга по их привычкам, например, по часто посещаемым разделам сайта или особенностям движения курсора.
Итак, чтобы понимать, что посетитель уже бывал на определенном ресурсе, нужно на его стороне, т.е. на компьютере, телефоне или другом устройстве, установить какую-то долгоживущую метку, а также получить возможность считывать ее в случае повторного посещения сайта. В современных браузерах имеется много вариантов выполнения этого действия, причем, вполне прозрачно для пользователей.
Во-первых, это уже упомянутые выше «печеньки» (куки). Во-вторых, имеются определенные планигы, похожие на куки по функциональным возможностям. Это может быть LSO (Local Shared Objects), которым пользуется Adobe Flash, или его аналог в Silverlight. Есть подобные возможности и в HTML5, в том числе, реализуемые через инструменты localStorage, File и IndexedDB API.
Есть и другие места для хранения маркеров – это могут быть кешированные данные на локальном устройстве или различные типы также кешированных метаданных (Last-Modified, ETag). Также для идентификации пользователей можно применять отпечатки Origin Bound сертификации, которые браузеры генерируют при SSL-соединениях, по информации из SDCH-словарей, их содержанию или метаданным. В общем, вариантов много.
Куки – это самый первый из инструментов, который создавался специально для того, чтобы сохранять на стороне клиента небольшие объемы данных. Потому они и становятся первыми, о чем вспоминаешь, когда задумываешься об идентификаторах.
При первом обращении пользователя к серверу, он генерирует уникальную метку, которую правильнее называть идентификатор. При первом посещении сервер формирует ее и передает клиенту вместе с другой информацией для сохранения в куках. При каждом повторном обращении клиент будет сразу отправлять этот идентификатор серверу.
И, хотя, большая часть браузеров сегодня оснащены удобными для пользователя возможностями очистки и настройки куков, а в Интернете можно найти огромное количество специальных утилит для очистки или блокировки куков, этот метод трекинга не теряет популярности. Причина в том, что большинство пользователей крайне редко вспоминают о куках и чистят их. Ну, подумайте сами, когда лично вы это делали в последний раз? Одна из самых распространенных причин – боязнь случайно удалить нужную куку, ведь в «печеньке» нередко хранятся сведения для быстрой авторизации.
Часть современных браузеров позволяют ввести ограничение на установку сторонних cookies, но проблему эта надстройка не решает. Браузеры нередко путают сторонние и «родные» куки, например, при получении информации через HTTP-редиректы и при других подобных методах обращения к странице.
Использование куков, в отличие от многих других методов, один из самых прозрачных с точки зрения пользователя методов. Но чтобы «узнавать» посетителя, уникальную метку нет нужды хранить в отдельном файле. Идентификатор можно собирать из нескольких куков, хранить в других типах данных, например, в Expiration Time и т.п. Потому бывает крайне сложно разобраться, применяется ли определенная cookies для трекинга или нет.
Этот механизм применяется Adobe Flash для хранения информации на машине клиента. LSO считается аналогом «печенек» в HTTP, но позволяет сохранять большие объемы данных с меньшими ограничениями, потому анализировать и проверять на наличие посторонних меток такие объекты крайне сложно.
Раньше, до появления Adobe Flash 10.3, настраивать поведение LSO нужно было отдельно от браузера, приходилось использовать менеджер настроек Флеш на сайте macromedia.com. Более поздние версии позволяют настраивать флеш-куки в контрольной панели браузера. Кроме того, большинство современных браузеров довольно глубоко интегрированы с флеш-плеером, потому при удалении куков и других временных файлов, удаляются и LSO. Впрочем, интеграция не настолько глубока, потому не всегда настройка политики работы со сторонними куками в браузере затрагивает и Local Shared Objects. На сайте разработчика Adobe вы можете изучить информацию, как LSO отключается вручную.
Платформа Сильверлайт во многом сходна по функционалу и особенностям работы с Adobe Flash. Здесь также есть свой аналог флеш-куков – Isolated Storage. Но настройки приватности для Silverlight имеют очень заметные отличия. Во-первых, это хранилище не интегрируется в принципе с браузерами, потому любая очистка кэша и других данных в браузере никак не затронет Isolated Storage. Во-вторых, инструмент использует одно хранилище для всех вкладок и окон браузера. Исключение составляют только вкладки, которые вы открываете в режиме «Инкогнито», а также для всех профилей, которые установлены на устройстве пользователя.
Технически хранилище Isolated Storage – такой же удобный инструмент для хранения меток-идентификаторов, как и LSO. Но добраться к нему с помощью пользовательских настроек браузера пока что невозможно, потому он пока что не часто применяется в качестве инструмента идентификации пользователей.
HTML5 – это целый набор инструментов, которые специализируются на хранении структурированной информации того или иного типа на устройстве клиента,. В их перечень входят localStorage, File API и IndexedDB. Каждый из перечисленных механизмов имеет свои особенности, но все они обеспечивают возможность на постоянной основе хранить структурированные бинарные данные без ограничения их размеров, при этом привязывают их к тому или иному ресурсу. Важно, что в отличие от обычных «печенек» или флеш-куков, HTML5 не имеет никаких ограничений на размер этих данных. Хранилища HTML5 расположены там же, где и другие сведения с сайтов. Но в интерфейсе браузера управление ими затруднено, так как обычному пользователю бывает трудно догадаться, где находятся нужные разделы.
Например, для удаления информации, сохраненной в localStorage, в браузере Firefox нужно выбрать «offline website data» или «site preferences», после чего нужно задать для временного промежутка значение «everything». Для IE работает в HTML5 особая «фишка». Здесь данные хранятся только в период жизни табов, которые были открыты в момент их сохранения.
Также HTML5 не особо стремится соответствовать приятым в cookies ограничениям и правилам. Например, в localStorage сервер сможет писать информацию и считывать ее через кросс-доменные фреймы, причем, этот метод доступен даже в режиме полного отключения сторонних куков.
Всем нравится, когда браузер не «подтормаживает», а сайты грузятся быстро. Потому для часто посещаемых ресурсов создается локальный кеш. Он был создан для того, чтобы временно хранить информацию со страниц сайтов, которую не обязательно заново запрашивать в случае повторного запроса страницы. В принципе, этот инструмент не предназначен для идентификации пользователей, но есть множество возможностей использовать его в этих целях. Например, после запроса к сайту клиент получает документ JavaScript, внутри которого хранится идентификатор, а в заголовках Expires / max-age= указывается очень отдаленная дата. В результате скрипт с меткой внутри прописывается в кеше. Теперь к нему можно обращаться с любых ресурсов в сети Интернет, просто отправив запрос.
Само собой, что браузер будет время от времени с помощью запросов в заголовке If-Modified-Since будет проверять наличие каких-то изменений на сайте. Но если каждый раз сервер будет выдавать ответ, что изменений нет через специальный код 304 (Not modified), файл с меткой может храниться вечно.
Что еще интересного можно сказать про кеш? В нем не существует, так называемых, «сторонних» и «родных» объектов, как это работает для обычных «печенек». А если вы полностью откажетесь от кеширования, производительность работы браузера может заметно снизиться. При этом автоматически определить, какой ресурс «хитрит» и отправляет внутри документов метки-идентификаторы крайне сложно, так как количество документов JavaScript в Интернет огромно, а их сложность может быть очень разной.
Конечно, современные браузеры позволяют в любое время полностью очищать кеш. Но на практике, все мы это делаем довольно редко, если выполняем это действие вообще.
Сайты регулярно обновляются, потому для правильной работы кеширования нужен инструмент, позволяющий серверу сообщить в браузер об изменениях на странице. В стандарте HTTP/1.1 существует два варианта обмена информацией про обновления. В первом случае выполняется анализ даты изменений в файле, во втором применяют специальный идентификатор под названием ETag.
При работе с ETag сервер в ответ на клиентский запрос формирует документ, в заголовке которого имеется version tag . При повторных посещениях сайта клиент включает в запрос значение этого заголовка в переменной If-None-Match, и, таким образом, сообщает о локальной версии. Если она актуальна, сервер отправляет в ответ код 304, и при загрузке страницы используются существующие кешированные данные. Если нет, клиенту отправляется новый вариант документа вместе с новым ETag. Такой вариант работы в чем-то похож на применение HTTP-куков, когда сервер хранит на локальных машинах какие-то сведения с единственной целью, прочитать их при повторных посещениях.
Вариант работы с Last-Modified предполагает возможность сохранять дату последних изменений, на которую выделяется объем от 32 бит или больше. При обращении к странице сайта эти сведения отправляются серверу в заголовке под названием If-Modified-Since. Здесь интересен тот момент, что большая часть браузеров никак не проверяют правильность формата даты. Важно понимать, что объекты ETag и Last-Modified не удаляются вместе с куками или данными сайта, здесь помогает только очистка кеша.
Инструмент Application Cache указывает, какие фрагменты страницы сайта сохраняются на диске пользователя и будут доступны, в том числе, в режиме офлайн. Правила хранения и доступа задаются при помощи специальных манифестов. AppCache, как и обычное кеширование, сохраняет уникальные данные и внутри непосредственно манифеста, и в составе ресурсов, не имеющих ограничений по сроку хранения, в отличие от привычного всем кеша. Можно сказать, что AppCache – это промежуточное решение между традиционным кешем и возможностями HTML 5. В части браузеров реализована возможность удалить эти сведения вместе с куками, для других нужно очищать историю просмотров и кеш.
SDCH – это специальный алгоритм сжатия информации, который был разработан компанией Google. Он пользуется специально составленным словарем, который предоставляет сервер, в результате клиент получает более высокую компрессию в сравнении с использованием deflate или Gzip.
В основе метода лежит тот факт, что сайты массово передают клиенту большие объемы повторяющейся информации. Это могут быть, например, футоры и «шапки» страниц, значения JS и CSS, другие элементы, которые остаются неизменными при переходе из одного раздела в другой. Для экономии ресурсов сервер при обращении к сайту один раз передает специальный SDCH-словарь, в котором содержатся повторяющиеся значения. Далее, при обращении к странице сервер отправляет браузеру ссылки на элементы словаря, а клиент уже сам собирает из них страницу.
Понятно, что в подобный словарь можно добавить любую информацию, в том числе, уникальные идентификаторы. Их размещают в ID словарях. Если пользователь заходит на сайт повторно, сервер запрашивает из словаря соответствующую информацию и получает ее в заголовке Avail-Dictionary. Можно указать метку и в самом контенте, после чего пользоваться ей, как при работе с обычным кешем.
Существуют и другие методы оставить «метку» для последующей демонстрации рекламы. Например, JavaScript и его аналоги позволяют сохранять идентификаторы так, что очистка истории и данных сайтов ему никак не повредят.
Например, подобные переменные успешно хранятся в sessionStorage или window.name. Здесь не всегда поможет самая тщательная очистка браузера. Если при проведении операций удаления куков и другой сохраненной информации пользователь оставил открытой вкладку с сайтом, повторный заход приведет к тому, что токен отправится на сервер, а пользователь будет «привязан» к данным, полученным о нем при предыдущем посещении. Аналогично работает и JS. В принципе, любой открытый элемент JavaScript сохраняет свое состояние даже при удалении куков и данных сайта. Причем, скрипт может не просто находиться на определенном сайте, но даже прятаться во фреймах, веб-ворках и других подобных элементах. Например, если при посещении страницы подгрузилась дополнительная iframe реклама, удаление данных сайта или истории ей вообще никак не помешают. Скрипт JS сохранит уникальную метку и позволит использовать ее в будущем.
Кроме описанных выше вариантов хранения уникальных меток при помощи кеширования, JavaScript или разных плагинов, современные браузер оснащены и другими возможностями, которые помогают им работать быстрее, но при этом позволяют сохранять и запрашивать идентификаторы.
Origin Bound Certificates (aka ChannelID) – фича, которая значительно повышает безопасность работы с HTTPS. В ней хранятся специальные самоподписанные персистентные документы, называемые сертификатами, которые позволяют при защищенном соединении идентифицировать клиента. В этом случае для каждого домена формируется и сохраняется собственный сертификат, предназначенный для повышения безопасности работы. Но сайты ОВС иногда используют и для трекинга, причем, они не предпринимают никаких дополнительных действий, которые были бы заметны пользователю. Один из примеров – наличие криптографичекого кеша. Он часто используется для SSL-рукопожатия, но вполне может выступить в качестве уникальной метки пользователя.
В TLS также имеются подобные механизмы – это session tickets и session identifiers. Эти инструменты применяются в случае, если сессия при соединении HTTPS была внезапно прервана. Чтобы пользователь не проходил полную процедуру рукопожатия заново, используются механизмы кешированных данных. Они позволяют определить подлинность запроса клиента, если перерыв между запросами оказался небольшим.
Еще один интересный инструмент – DNS-кеш браузера. В нем хранятся сведения небольших размеров, необходимые, чтобы повысить скорость проверки и разрешения имен сайтов при повторных обращениях и одновременно защитить систему от DNS rebinding атак. К примеру, доступно 16 IP адресов. В этом случае уже 8-9 имен, в том числе, зашифрованных, позволят провести идентификацию любого устройства. Но такое решение значительно ограничивается внутренним объемом DNS-кеша, потому есть риск возникновения конфликтов разрешения имен и DNS провайдера.
Все ранее описанные варианты были основаны на установке на устройство пользователя какого-то уникального идентификатора, который сервер сможет получить при повторных обращениях. Но существует иной вариант отслеживания пользователей, менее очевидный. Он основан на запросе или измерениях параметров устройства клиента. Каждая из характеристик отдельно – это не более, чем несколько бит данных, но, если получить одновременно несколько, можно отследить любой компьютер или телефон. Кроме того, что изучение параметров устройства намного сложнее отследить и запретить, этот метод позволяет идентифицировать пользователя, который ходит в Интернет из разных браузеров или пользуется режимом «инкогнито».
Один из самых простых методов трекинга – составление уникальной метки методом объединения параметров, которые доступны в браузере. Каждый из них отдельно не слишком интересен для анализа. Но их сочетание помогает «узнать» и определить браузер пользователя:
Отслеживают уникальных пользователей и по параметрам, связанным с архитектурой локальной сети и особенностями сетевых протоколов.
Такой метод позволит отслеживать пользователя, независимо от браузеров, которые он использует. Их невозможно скрыть при помощи режимов инкогнито, других вариантов приватного просмотра или различных security-приложений.
Перечень этих сведений включает:
Современные технологии позволяют изучать не только метки-идентификаторы и особенности оборудования, но и поведенческие факторы самого человека. Это могут быть настройки региона и особенности поведения. Таким образом получается определить пользователя, даже если он меняет браузеры или использует режим «инкогнито».
Для выявления факторов поведения используют такие данные:
Также помогают определить пользователя любые варианты изменения шрифтов и масштабирования сайта, измерение уровня zoom’а, применение специальных возможностей. Изучаются фичи браузера, которые настраивает пользователь: блокировка куков, всплывающих окон и рекламы, DNS prefetching, особенности настроек безопасности флеш и т.д. Как ни парадоксально, если вы старательно настраиваете удобный и защищенный вариант работы под себя, вы, тем самым, даете массу информации для вашей идетификации.
И это только часть подобных сведений, самые популярные и очевидные. Если поискать глубже, их может найтись еще очень много.
Как видим, на самом деле существует очень много вариантов трекинга пользователей. Некоторые оказываются последствиями багов в релизах или упущений, теоретически их можно исправить. Другие «закрыть» невозможно, разве что полностью изменить принципы работы компьютеров, сетей, браузеров и программного обеспечения. С некоторыми методами можно бороться, например, своевременно проводить очистку браузера и системы. Другие вы при всем желании не заметите, да и бороться с ними практически невозможно. Потому самое главное правило посещения Интернет: даже если вы пользуетесь лучшими решениями для анонимного и защищенного просмотра, помните, что отследить вас все равно возможно.