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

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

Проголосовало 183 человека. Воздержалось 50 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (35)


  1. T-362
    26.06.2017 12:33
    +2

    Есть решение чуть более громоздкое, но простое — два разных браузера. Пользуетесь как основным чем-то на основе хромиума — поставьте лисичку и ходите в соц-цети только с нее, или наоборот. Конечно еще вариант использовать разные профили в браузере или два производных от хромиума/две лисы, но лучше не рисковать.


    Для полной секъюрности соц-сети можно держать на портабл версии браузера, стоящей в отдельном шифрованном томе и стирать его перед использованием.


    1. mayorovp
      26.06.2017 13:49

      Какой риск использования разных профилей пользователя и почему это хуже чем портабл-версия браузера?


      1. T-362
        26.06.2017 13:59

        При использовании одного браузера есть большая вероятность что из-за ошибок/аддонов/злого умысла получится взаимодействовать с другим профилем или просто иметь общедоступные данные.
        Портабл версии же специально затачиваются на изолированную работу не вылезая из своих директорий и не разбрасываясь данными (собственно для обеспечения переносимости).


        1. mayorovp
          26.06.2017 14:14

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


          1. T-362
            26.06.2017 14:46

            И что с того, если это две независимые копии браузера? У портабельной версии заданы относительные пути что-бы она хранила и использовала нужные файлы из своих собственных папок (в основном, может отличаться от браузера к браузеру).


            Ну и что-бы наверняка см. пункт 1 — "два разных браузера"


      1. qw1
        26.06.2017 20:30

        Какой риск использования разных профилей
        Главный риск — человеческий фактор. Лучше, чтобы браузеры для разных сценариев отличались как можно сильнее. И привычка не даст ошибиться, когда окно логина выглядит «как-то не так».


  1. http2
    26.06.2017 13:56

    1. Некоторые сайты приотключении сторонних кук перестают работать :)
    2. AdBlock


    1. Myosotis
      26.06.2017 14:26

      AdBlock не блокирует маяки, они и не являются рекламой сами по себе. Они фиксируют, на каких сайтах был пользователь и передают эту информацию заинтересованной стороне.
      Я еще не сталкивалась с тем, что блокировка 3rd party cookies приводит к неработоспособности сайта. Вы не путаете с 1st party cookies?


      1. Nord001
        26.06.2017 15:22

        Большая часть «маяков» идут вместе с рекламой — так что — блокирует.

        Остальное что ставят напрямую: метрика — гугл аналитика — шаринг соц. сетей и реже ставят пиксели для ретаргетинга.

        По поводу не принимать сторонние куки — как я помню — достаточно 1 раз посетить сайт *.domain.com и куки будут приниматься и посылаться при запросах на *.domain.com со сторонних сайтах.


        1. Myosotis
          26.06.2017 16:15

          Если включить эту опцию и повторить предыдущие эксперименты, можно увидеть, что cookies сторонних сайтов (Facebook и Google соответственно) не будут приниматься и отправляться.

          Они не будут отправляться при включенной опции "Блокировать сторонние cookies", это и проверялось в эксперименте в браузерах Firefox, Safari и Chrome.


          А на 2012 год ситуация была, как вы помните:


          While Firefox blocks third-party cookies both from being set as well as from being sent, most other browsers
          (including Chrome, Safari, and Internet Explorer) only block the setting of third-party cookies. So, for example,
          Facebook can set a first-party cookie when the user visits facebook.com; in browsers other than Firefox, this
          cookie, once set, is available to Facebook from a thirdpartyposition (when embedded on another page).


        1. Myosotis
          26.06.2017 16:21

          Большая часть «маяков» идут вместе с рекламой — так что — блокирует.

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


      1. sacrefacker
        26.06.2017 23:05

        Похоже, Atlassian не пускает:

        Something has gone wrong
        Please make sure your browser has third-party cookies enabled and then try again using the button below. Don't refresh the page.


  1. AndKost
    26.06.2017 14:29
    +1

    Интересная статья, продажа пользовательской информации — огромнейший бизнес для компаний.


  1. poznawatel
    26.06.2017 14:57

    Disconnect.


  1. dbagaev
    26.06.2017 18:37

    Уже давно есть специальные плагины для браузеров, которые блокируют трекеры, например, Ghostery. Он показывает, какие трекеры стоят на странице, позволяет отключить все или выборочно.

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

    Если хочется анонимности, то надо ходить по Сети не логинясь ни в какие аккаунты вообще.


  1. lostpassword
    26.06.2017 20:32

    А можете эти топ-20 доменов выложить в виде текстового списка?
    Интересно в hosts добавить и посмотреть, не отвалится ли что-нибудь.


    1. Myosotis
      26.06.2017 23:30
      +2

      Вот держите топ-50


      но у вас отвалится google, например

      google-analytics.com
      doubleclick.net
      google.fr
      rubiconproject.com
      facebook.com
      twitter.com
      gstatic.com
      mathtag.com
      pubmatic.com
      advertising.com
      googlesyndication.com
      rlcdn.com
      adnxs.com
      casalemedia.com
      quantserve.com
      bluekai.com
      smartadserver.com
      exelator.com
      stickyadstv.com
      betrad.com
      bidswitch.net
      demdex.net
      yahoo.com
      adform.net
      nexac.com
      krxd.net
      turn.com
      bidr.io
      360yield.com
      adsrvr.org
      load.s3.amazonaws.com
      openx.net
      mookie1.com
      chango.com
      lijit.com
      adledge.com
      adsafeprotected.com
      teads.tv
      adgrx.com
      atdmt.com
      kiosked.com
      tapad.com
      truste.com
      yldcrt.com
      moatads.com
      scorecardresearch.com
      d5nxst8fruw4z.cloudfront.net
      agkn.com
      everesttech.net
      gwallet.com


      1. lostpassword
        27.06.2017 07:38

        Спасибо!

        P.S. А что именно отвалится? Проверил сейчас — поиск работает, почта работает, Hangouts работает, переводчик работает…
        А больше мне и не надо ничего.)


        1. Myosotis
          27.06.2017 11:15

          А, потому что в списке google.fr
          Вот так отвалится поиск:
          0.0.0.0 www.google.com
          0.0.0.0 www.google.ru

          Только блокировать google через hosts это серьезно)


          1. lostpassword
            27.06.2017 11:32
            +1

            Ну так я google блокировать и не планировал)
            Только рекламные домены и аналитику (типа google-analytics.com).


  1. federalkosmos
    26.06.2017 20:56

    Не совсем по теме.
    Ну а что делать с сайтами, при посещении которых всплывает запрос на подтверждение согласия на
    использование cookie, и только кнопка Ok? А если я не хочу, чтобы сайт использовал куки? Как отказаться?


    1. mayorovp
      27.06.2017 08:39
      +3

      Закрыть вкладку. Самый надежный способ отказа.


  1. FreeMind2000
    26.06.2017 23:56

    В Firefox есть приватное окно, по идее оно должно спасать от открытых залогиненых страниц в основном окне.


    1. ZoomLS
      27.06.2017 02:11
      +2

      В Firefox ещё есть контекстные контейнеры. Можно создать контекстный контейнер, например для соц сетей. И только через него в них заходить.


      1. FreeMind2000
        27.06.2017 14:54

        Что-то у себя в FF 52.2.0 ничего такого в меню не нашел.


        1. ZoomLS
          27.06.2017 22:42

          Зачем такую старую версию использовать? Недавно уже Firefox 44 вышел.
          Вообще, нужно зайти в about:config, там найти privacy.userContext и выставить true. После перезагрузки заработают. Но в 52 версии, вроде ещё нельзя было их редактировать, может даже новые ещё нельзя создавать. Вот в 44 версии всё ок. Советую обновиться до последней версии.


          1. FreeMind2000
            28.06.2017 00:55

            Это последняя версия для хп. Да в конфиге есть, но как-то муторно немного всё, перепутать вкладки легко да еще и искать надо в куче других, у меня их много обычно открыто… приватное окно на мой взгляд удобнее, да и особого смысла куки сохранять не вижу. Открыл прив.окно выбрал сайт в избранном и всё.


            1. ZoomLS
              28.06.2017 16:16

              Контекстные вкладки подсвечиваются, они отличаются от стандартных.


  1. ElectroGuard
    27.06.2017 01:59

    Кроме AdBlock'а есть еще AdGuard. Насколько я знаю — он блокирует 'маяки'. Его и использую.


  1. lpUsher
    27.06.2017 11:08

    Интересно поданный приступ критической паранойи, но, как говорилось, реклама — двигатель прогресса, вы не получаете никакой проблемы вроде, кроме сменяющихся картинок в соц.сетях (какие-то будут всегда).
    А вообще, чем не подходит каждый раз заходить из-под инкогнито? Тот же самый ТОР каждый раз создает новое соединение с чистого листа.


    1. nmaltsev
      27.06.2017 12:33

      Проблемы появляются для пользователей если собранную статистику начинает использовать тот кто может проанализировать большой объем информации. Например крупный ретейлер как Amazon или Uber.


      1. lpUsher
        27.06.2017 12:40
        -1

        Проблемы в виде рассылок? Что мешает настроить ящик на спам? Многие проблемы выдумывают сами пользователи.


        1. nmaltsev
          27.06.2017 14:28
          +1

          Изменение цены на один и тот же товар/услугу, для разных пользователей, опираясь на предположение о платежеспособности этих самых пользователей.


  1. VtD
    27.06.2017 13:17

    >использовала tld библиотеку
    Пожалуйста, поправить. Россия язык не использует такие конструкции.


  1. lostmsu
    29.06.2017 19:55

    Для FB можно тупо поставить приложение из магазина и вообще в браузере в него не логиниться. То же самое с VK.