Редактор Хабрахабра
2,0
рейтинг
18 августа 2013 в 20:55

Разработка → Cookie без куков перевод

Отслеживание



Как мы обычно отслеживаем посетителей сайта? Одним из следующих методов:

  • cookies
  • javascript
  • local storage
  • flash, java, иные плагины
  • ip-адрес и UserAgent


Допустим, пользователь отключил всё это (и ходит через прокси или даже vpn). Есть ли способ всё-таки его отследить?
Оказывается — да. Это кэш браузера.

Демонстрация технологии находится на странице оригинальной статьи.

Объяснение работы



image

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

При первой загрузке файла (например, изображения) браузер получает ETag. Потом он передаёт этот etag серверу, и тот проверяет, не поменялась ли контрольная сумма, и следовательно — файл.

Становится понятно, что вместо использования по назначению, веб-сервер может использовать этот etag как идентификатор пользователя.
Если etag нет, отдаём новый. Если прислали etag, ищем его в базе пользователей, и отдаём его же.

У технологии есть недостатки — картинка грузится после того, как загрузится страница, поэтому пользователь увидит информацию от своего предыдущего посещения. Однако, если эта технология используется для скрытого слежения, то это никому не мешает.

Вывод: если вы хотите на 100% защититься от отслеживания, вам придётся отключить все плагины, яваскрипт, куки и кэширование страниц. Хотя, полагаю что мега-параноики и так всё это отключили.

На гитхабе доступны исходники работающего прототипа программы отслеживания от автора статьи.
Перевод: lucb1e
Вячеслав Голованов @SLY_G
карма
262,2
рейтинг 2,0
Редактор Хабрахабра
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

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

  • +16
    Это великолепно!
  • +38
    > Оказывается — да. Это кэш браузера.
    Ну это не новость совсем.
    Вот, например, статья от 2003 года, где рассматривается эта техника: www.arctic.org/~dean/tracking-without-cookies.html

    Всё новое — хорошо забытое старое.
  • –11
    обычно ставят проверки, и юзер которого нельзя идентифицировать получит об этом сообщение. Подумал-подумал и не нашел применения я этой фичи
    • 0
      Тут смысл не в использовании этой функции как дополнения методов идентификации, а в её использовании, когда другие методы отключены пользователем или недоступны.
  • +20
    Это один из восьми способов, которым пользуется evercookie, которым уже несколько лет как )
    • 0
      Который легко убивается Incognito mode в Chrome и InPrivate в IE.
  • +2
    Я просто оставлю это здесь
    • 0
      Упоминается в оригинале, в том контексте что даже там такой идентификации не предусмотрено.
    • 0
      У ip-check.info более подробная проверка, включая кэш браузера.
  • 0
    От этого спасает использование portable версий браузеров, в каждом из которых будет свой кэш, своя кука и т.д.
    Но тема интересная. Теперь кроме кук, еще и файловый кэш чистить придётся :)
  • +2
  • 0
    А еще есть хак с историей.
    Например, сохраняем строку abc.
    Совершается 3 запроса:
    http:/url/a
    .../ab
    .../abc

    затем есть функция, умеющая отличать посещённую ссылку от непосещенной, и она перебирает нужные данные, пока не встретит завершающий символ.
    И да… это все делается без запросов к серверу, поскольку идет работа с историей браузера
    • +1
      Насколько я помню эта функция не работает как минимум в лисе, потому что стили посещенной ссылки отдаются яваскрипту такими же, как и у непосещенной
      • +1
        Сейчас уже ни у кого не работают.
        • 0
          Да, сорри, устарело :)
  • НЛО прилетело и опубликовало эту надпись здесь
  • –6
    image
  • +6
    Есть еще один гораздо более близкий к кукам механизм, который активно используется трекерами типа TNS, но о котором почему-то мало бузят. Это TLS Session Ticket которые описаны в www.ietf.org/rfc/rfc5077 и поддерживаются и в Chrome и в Firefox. Суть весьма простая — фактически, это та же самая кука, но на уровне TLS, сервер скармливает любые данные и клиент их возвращает при следующем TLS-коннекте. Напишите статейку о нем, окружающим будет полезно знать.
    • 0
      А вы не занимались вплотную? Резим Incognito хрома подвержен такой идентификации (остальные вроде не работают)?
      • +3
        Судя по комментариям подвержен частично, т.к. для режима инкогнито используется отдельный кэш (net: split the SSL session cache between incognito and normal) хотя изначально патч предполагал полный отказ от идентификаторов сеанса (Incognito mode does not use TLS Session IDs at all — support for TLS Session Resumption is disabled completely). Причем до сих пор нет возможности сбросить кэш.
  • +1
    Можно, кстати, генерировать не просто img с именем контрольной суммы, а, еще само изображение дополнить шифродатой (0 — белый, 1 — черный пиксель) — старый достаточно трюк.
  • 0
    ip-check.info тоже годен
  • +1
    > У технологии есть недостатки — картинка грузится после того, как загрузится страница, поэтому пользователь увидит информацию от своего предыдущего посещения.
    А нельзя на саму страницу вешать ETag и менять его каждый раз, обновляя соответствие в своей базе ID Пользователя <-> ETag?
  • +1
    Отлично. Вы узнали, что в запросе на отдачу это такой-то пользователь. И вот он заходит на другую страницу, которую ещё не загружал, запрашивает /GET index2.html, как вы узнаёте, что это он же? Если даже поместить в этот index2.html ту же картинку, на неё следом, после получения index2.html пойдёт отдельный запрос. И будет уже поздно вписывать в страницу «Дорогой пользователь такой-то, мы вас узнали», потому что от кого именно пришёл запрос на index2.html — не понять. Если вы, конечно, не хотите в адресную строку добавлять ?_session_id=.
    Аналогично с local storage, это локальный механизм хранения на пользовательской стороне, а не передачи состояния.
    Так что такая штука пойдёт разве что для дополнительной защиты параноиков. Которые уже наверняка сидят из shell'а lynx'ом.
    • 0
      Баннерная сеть (баннер которой встроен во множество сайтов) может быстро изучить ваши предпочтения и показывать релевантную рекламу, даже если у пользователя выключены third-party cookies.
      Не знаю, что там делает средний параноик, но полезно представлять себе все возможные пути идентифицирующей информации.
      В моей молодости на местном форуме некто написал из-за прокси нехорошее сообщение.
      У него оказался достаточно уникальный User-agent, поэтому располагая даже только логами со стороннего ресурса (хостинг картинки для подписи итд) обнаружить негодяя не составило труда.
  • +1
    Я думаю, еще можно идентифицировать по паттернам поведения большинство постоянных пользователей сайта… :)
    • 0
      Думаю ребята из Школы Анализа Данных гугла иди яндекса знают такие методы, которых здесь мало кто догадывается.

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