Дискриминация котов: веб-трекинг через невидимые картинки

в 8:58, , рубрики: cookies, IT-стандарты, python, sql, браузеры, дискриминация, интернет-маргетинг, информационная безопасность, приватность, Социальные сети и сообщества, Статистика в IT, трекинг, электронная коммерция

image

Вы когда-нибудь задумывались над тем, по какому принципу вам показывают таргетированную рекламу? Почему, даже не лайкая ничего во время сёрфинга вы, возвращаясь на Facebook, видите рекламу, связанную с посещёнными вами сайтами? И кто заинтересован в том, чтобы отслеживать пользователей? В рамках моего учебного проекта, мне предстояло выяснить, какие компании стоят за трекингом посещений сайтов, и что они используют, чтобы делать это, не привлекая особого внимания.

Почему дискриминация

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

Что такое веб маяки

Веб маяк (в английском варианте «web beacon», или «1x1 pixel image») — это крошечная или прозрачная картинка, которая встраивается в страницу и используется для отслеживания действий пользователей.

image

Такие невидимые маяки могут использоваться не только для веб аналитики, но и для сбора агрегированной информации с целью продажи её сторонним сайтам, для построения социальных графов. Ещё одним из способов применения веб маяка это проверка, что электронное письмо прочитано. Отправитель узнает об этом, как только по определенной ссылке картинку запросили, а адресат может и не заметить, что она была в теле письма.

Сбор данных и статистика

В качестве начальных данных у меня было несколько JSON файлов со ссылками на картинки (как статически, так и динамически подгружаемых) с топ 800 доменов (по версии ALEXA). Оставалось разработать скрипт, который парсит эти файлы, проходит по ссылкам, закачивает картинки и сохраняет информацию о них в базе данных SQLite.

image

Эти JSON файлы содержали все ссылки на картинки, как 1st party (картинки находятся на том же сайте, где размещена ссылка на них) так и 3rd party (картинки хранятся на сторонних сайтах). И если в первом случае, маяки могут использоваться вполне в безобидных целях (для веб аналитики в пределах сайта), то во втором случае задействовано несколько сторон, и это уже межсайтовый трекинг. Так как интересовал именно последний случай, я использовала tld библиотеку, чтобы извлекать домен верхнего уровня.

Скрипт работает так, как если бы все cookies очищались перед каждым запросом, поэтому в первоначальных запросах к серверам поле Cookies пустое. Если в ответе от сервера есть заполненное поле set-cookie, это значение заносится в базу данных.

Есть два способа вычисления маяка: проверка размера и проверка поля в HTTP заголовке content size. Но не все ответы на запросы содержат поля content length и content type, так как они опциональные и даже могут содержать неправильные данные. Также встречаются маяки, которые при размере 1x1, возвращаются в пакете с content length > 100, так как картинка PNG формата. Поэтому при построении графиков я не учитывала значение content length.

Что делать, если в ответе нет картинки? Бывает, что сервер возвращает статус 204. Это означает, что контента нет, но, тем не менее, прохождение по ссылке зафиксировано. Поэтому если статус 204 и content type в HTTP заголовке содержит «image/», скрипт предполагает, что это веб маяк и помещает в базу значения width = 0 и height = 0. Таких маяков встретилось 37 294 (1.53%).

Всего было проверено 8 586 314 ссылок на картинки, в базе содержатся данные о 5 873 372 3rd party картинках, из них 2 431 277 маяка (41% от количества сторонних картинок это веб маяки!).

И еще немного статистики

В таблице image_domains хранится информация о провайдерах картинок (то есть это не те 800 топ сайтов со ссылками на картинки, а сервера, непосредственно хранящие эти картинки).

Количество доменов: 800
Количество доменов, где встретился хотя бы один маяк: 760
Количество страниц: 124 214
Количество страниц, где встретился хотя бы один маяк: 111 442
Количество провайдеров картинок: 4 348
Количество провайдеров картинок-маяков: 1 325

И то, что есть 40 доменов, на которых не встретился ни один маяк, не говорит о том, что они их не используют. Возможно, они используют маяки нестандартного размера (1x2, 3x1), которые тоже встречались при выборочной проверке ссылок.

Топ игроки на рынке веб трекинга

Итак, в базе 2 431 277 маяков. Интересно узнать, маяки каких из 1 325 провайдеров чаще всего встречались на страницах топ 800 доменов.

def plot1(dbname, condition):
    #providers of beacons - count of beacons 
    logname = open(u'plot1'+dbname+'.csv', 'w')
    db = SqlConnector(dbname)
    output = db.execute("SELECT image_domains.domain, count(images.id) 
                as imgcount FROM images INNER JOIN image_domains ON 
                image_domains.id = images.id_image_domains WHERE " + condition +
                " group by image_domains.domain order by imgcount DESC;")
    for item in output:
        logname.write("{0};{1}n".format(item[0], item[1]));
    logname.close() 

Здесь condition это «width <= 1 and height <= 1».

Стоит заметить, что, так как одни и те же найденные маяки могут встречаться на разных страницах, количество маяков не равно количеству уникальных маяков, то есть в таблице images могут быть дубликаты (поле url не уникальное).

По оси x — провайдеры маяков, по оси y — количество маяков.

image

Теперь посмотрим на количество страниц среди топ 800 доменов, которые отслеживаются провайдерами маяков. То есть, на каждой из этих страниц встречается хотя бы один маяк.

SELECT image_domains.domain, count(distinct images.id_pages) 
                as pagescount FROM images INNER JOIN image_domains ON 
                image_domains.id = images.id_image_domains WHERE width<=1 and height<=1
                group by image_domains.domain order by pagescount DESC;

По оси x — провайдеры маяков, по оси y — количество страниц.

image

А ниже вы увидите самый интересный график, который показывает как много уникальных доменов (те самые топ 800) отслеживаются провайдерами маяков, то есть у каждого такого домена есть хотя бы одна страница с хотя бы одним маяком.

SELECT image_domains.domain, count(distinct pages.id_domains) 
                as domainscount FROM images INNER JOIN image_domains ON 
                image_domains.id = images.id_image_domains INNER JOIN pages ON 
                images.id_pages = pages.id WHERE width<=1 and height<=1
                group by image_domains.domain order by domainscount DESC;

По оси x — провайдеры маяков, по оси y — количество доменов.

image

На последнем графике видно, что в основном провайдеры относятся к категориям «веб аналитика» и «реклама». Но интересно, что встречаются маяки от поискового движка Google и социальных сетей Facebook и Twitter. Эти провайдеры наиболее интересны потому что если пользователь авторизован, такой трекинг не является анонимным.

Невидимые трекинг картинки на примере Facebook и Google

Facebook pixel

Facebook пиксели используются для перекрестной аналитики; каждый пользователь Facebook может бесплатно создать свой маяк в Adverts Manager. И в принципе понятно, почему это бесплатно ведь Facebook имеет свою выгоду: он получает данные о посещениях пользователей различных сайтов и может использовать их для таргетированной рекламы.

Всего в базе данных было обнаружено 751 уникальных пикселей Facebook, которые встретились на 59 023 страницах в Интернете.

Следующий эксперимент покажет, как это работает. Можно создать тестовую html страницу с каким-нибудь Facebook pixel или найти сайт, где он есть. Затем нужно зайти в настройки браузера и удалить все сохраненные cookies перед началом. Также нужно, чтобы в настройках браузера было разрешено сохранение и отправка сторонних cookies.

Если пользователь не авторизован в Facebook, всё, что отправляется в заголовке Send-Cookie к Facebook pixel это поле «fr» (видимо, локация пользователя).

image

В этом случае собирается анонимная статистика, не нарушающая приватность пользователя. Но, что если пользователь авторизован в Facebook? В этом случае отправляются значения, идентифицирующие пользователя.

image

Получается, что Facebook знает, какие сторонние сайты посещают пользователи, хотя, конечно, мы с этим соглашаемся (см. политику cookies на Facebook).

Google beacon

Google также умеет отслеживать пользователей, авторизованных в их сервисах. На скриншотах можно увидеть серфинг на одном из крупных дискаунтеров, где мне встретился маяк от Google. После авторизации в Gmail серфинг прекратил быть анонимным, так как стали отправляться пользовательские идентификаторы “SID”, “HSID”, “SSID”, “APISID”, “SAPISID”.

До авторизации в Gmail:

image

После авторизации в Gmail:

image

Как защититься

Нужно ли защищаться каждый решает для себя сам, лично мне не хочется, чтобы информацию о посещённых мною сайтах продавали третьим лицам без моего ведома (см. cookie syncing, cookie matching). Рассмотрим, существуют ли какие-то способы защиты.

Каждый раз очищать cookies

При каждой новой сессии можно очищать cookies, получая новые идентификаторы от трекеров. Но, как показано в прошлом разделе, это бесполезно, если на соседней вкладке вы авторизованы, например, в Facebook. К тому же, сейчас популярна техника отпечаток браузера (fingerprint), которая позволяет реидентифицировать хосты, очистившие cookies. Есть даже такое понятие, как «вечные cookies» — это такие техники, которые мешают попыткам пользователя замести следы, заново вычисляя его идентификаторы. Достигается это дублированием cookies в HTML5 LocalStorage, Flash LSOs, в кэше Etags и fingerprint. Техники идентификации пользователя по браузеру продолжают совершенствоваться, недавно появилась работа о межбраузерном отпечатке.

Блокировка JavaScript

Отключение поддержки JavaScript эффективно против трекеров, которые требуют API доступ, чтобы собирать данные, но бесполезно, если трекер использует HTML редиректы и просто устанавливает cookies через HTTP заголовок. К тому же, веб маяки легко закачиваются и без скриптов. Вот, например, как это реализовано в Facebook pixel:

<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '777', {em: 'insert_email_variable,'});
fbq('track', 'PageView');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=777&ev=PageView&noscript=1"
/></noscript>

Do Not Track

DNT — это HTTP-заголовок, предполагающий позволить обойти отслеживание действий пользователей сайтами. Но на самом деле нет никакой гарантии, что просьба «не отслеживать» будет удовлетворена. Более того, этот флаг даже используется в качестве одного из многих параметров в fingerprint техниках для более точной идентификации браузера…

Блокировка сторонних cookies

К счастью, в браузерах есть опция, позволяющая блокировать сторонние cookies. Отключенная по умолчанию, она хорошо скрывается в недрах настроек. Сложнее всего её было найти в Chrome.

Отключить её можно в Settings/Show advanced settings.../Content settings/Block third-party cookies and site data.

В Firefox: Options/Privacy/Uses custom settings for history/Accept third-party cookies: Never.
В Safari: Preferences/Cookies and website data/Allow from current website only
В Opera: Settings/Cookies/Block third-party cookies and site data

Если включить эту опцию и повторить предыдущие эксперименты, можно увидеть, что cookies сторонних сайтов (Facebook и Google соответственно) не будут приниматься и отправляться. Казалось бы, можно на этом успокоиться, но что если идентификаторы будут храниться где-то ещё (вспоминая «вечные cookies»)? Тогда, после авторизации в Facebook, идентификаторы могут сохраниться не только в стандартные cookies, но и продублироваться в локальное хранилище браузера и тогда уже с другого сайта код, отвечающий за скачивание веб маяка, может получить эти идентификаторы и связать их с пользователем. Здесь как раз бы помогло отключение Javascript…

Выводы

Получается, что веб трекинг через невидимые картинки довольно широко распространён.

Маяки, оставаясь невидимыми для пользователя, могут иметь нестандартные размеры (например, 1x5) и быть разных форматов. И хотя современные браузеры имеют возможность блокировать отправку и сохранение сторонних cookies, по умолчанию эта опция отключена и не является панацеей: с развитием web технологий мы можем опасаться того, что сервисы будут повсеместно использовать другие способы для хранения пользовательских идентификаторов, ведь это их хлеб.

И если раньше никто в интернете не догадывался, что ты — кот, теперь это, увы, не так.

Автор: Myosotis

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js