Как однозначно идентифицировать компьютеры, посещающие мой веб-сайт? - PullRequest
165 голосов
/ 19 октября 2008

Мне нужно найти способ уникальной идентификации каждого компьютера, который посещает веб-сайт, который я создаю. Есть ли у кого-нибудь совет, как этого добиться?

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

Я ценю помощь. Спасибо.

EDIT:

Печеньки не подойдут.

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

Ответы [ 21 ]

54 голосов
/ 20 июля 2010

Эти люди разработали метод снятия отпечатков пальцев для распознавания пользователя с высоким уровнем точности:

https://panopticlick.eff.org/static/browser-uniqueness.pdf

Мы исследуем степень, в которой современные веб-браузеры подлежат «дактилоскопии устройства» через информацию о версии и конфигурации, которую они передают веб-сайтам по запросу. Мы реализовал один возможный алгоритм дактилоскопии и собрал эти отпечатки пальцев с большой выборки браузеров, посетивших наш тестовый сайт, panopticlick.eff.org . Мы видим, что распределение нашего пальца print содержит не менее 18,1 бит энтропии, что означает, что если мы выберем браузер наугад, в лучшем случае мы ожидаем, что только один из 286 777 других браузеры поделятся своим отпечатком. Среди браузеров, которые поддерживают Flash или Java, ситуация хуже, со средним браузером, несущим по крайней мере 18,8 бит идентифицирующей информации. 94,2% браузеров с Flash или Java были уникальными в нашем образце.

Наблюдая за возвращающимися посетителями, мы оцениваем, насколько быстро со временем могут изменяться отпечатки браузера. В нашем образце отпечатки пальцев изменились довольно быстро, но даже простая эвристика обычно могла угадать, когда отпечаток пальца был «обновленной» версией ранее наблюдаемого браузера отпечаток пальца, с 99,1% правильных догадок и ложным положительным показателем только 0,86%.

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

31 голосов
/ 19 октября 2008

Невозможно идентифицировать компьютеры, получающие доступ к веб-сайту, без сотрудничества с их владельцами. Если они позволят вам, однако, вы можете сохранить cookie, чтобы идентифицировать машину при повторном посещении вашего сайта. Ключ, посетитель находится под контролем; они могут удалить cookie и появиться в качестве нового посетителя в любое время.

30 голосов
/ 19 октября 2008

Возможность использования флеш-куки :

  • Повсеместная доступность (у 95 процентов посетителей, вероятно, будет вспышка)
  • Вы можете хранить больше данных на файл cookie (до 100 КБ)
  • Совместно используется в разных браузерах, поэтому с большей вероятностью однозначно идентифицирует машину
  • Очистка файлов cookie браузера не удаляет флэш-файлы cookie.

Вам понадобится создать небольшой (скрытый) флэш-фильм для чтения и записи.

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

30 голосов
/ 10 января 2017

Введение

Я не знаю, есть ли или когда-нибудь найдется способ уникальной идентификации машин с помощью одного браузера. Основными причинами являются:

  • Вам нужно будет сохранить данные на компьютере пользователя. Эти данные могут быть удаляется пользователем в любое время. Если у вас нет способа воссоздать это данные, которые являются уникальными для каждой машины, то застряли.
  • проверка. Вы должны остерегаться подделки, перехвата сеанса и т. Д.

Даже если есть способы отслеживания компьютера без использования файлов cookie, всегда найдется способ обойти его и программное обеспечение, которое сделает это автоматически. Если вам действительно нужно что-то отслеживать на компьютере, вам нужно написать собственное приложение (Apple Store / Android Store / Windows Program / etc).

Возможно, я не смогу дать вам ответ на заданный вами вопрос, но я покажу вам, как реализовать отслеживание сеансов. С помощью отслеживания сеанса вы пытаетесь отслеживать сеанс просмотра, а не компьютер, посещающий ваш сайт. Отслеживая сеанс, ваша схема базы данных будет выглядеть так:

sesssion:
  sessionID: string
  // Global session data goes here

  computers: [{
     BrowserID: string
     ComputerID: string
     FingerprintID: string
     userID: string
     authToken: string
     ipAddresses: ["203.525....", "203.525...", ...]
     // Computer session data goes here
  }, ...]

Преимущества отслеживания на основе сеанса:

  1. Для зарегистрированных пользователей вы всегда можете создать один и тот же идентификатор сеанса у пользователей username / password / email.
  2. Вы по-прежнему можете отслеживать гостевых пользователей, используя sessionID.
  3. Даже если несколько человек используют один и тот же компьютер (например, интернет-кафе), вы можете отслеживать их отдельно, если они вошли в систему.

Недостатки отслеживания на основе сеанса:

  1. Сеансы основаны на браузере, а не на компьютере. Если пользователь использует 2 разных браузера, это приведет к 2 разным сеансам. Если это проблема, вы можете перестать читать здесь.
  2. Сессии истекают, если пользователь не вошел в систему. Если пользователь не вошел в систему, он будет использовать гостевой сеанс, который будет недействителен, если пользователь удалит файлы cookie и кэш браузера.

Осуществление

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

Основы

Я буду отслеживать сеанс, используя так называемый файл cookie навсегда. Это данные, которые автоматически воссоздают себя, даже если пользователь удаляет свои куки или обновляет свой браузер. Однако пользователь не сможет удалить и свои куки, и кеш браузера.

Для реализации этого я буду использовать механизм кэширования браузеров ( RFC ), API WebStorage ( MDN ) и куки-файлы браузера ( RFC , Google Аналитика ).

Правовая

Чтобы использовать идентификаторы отслеживания, вам необходимо добавить их как в вашу политику конфиденциальности, так и в условия использования, предпочтительно в подзаголовке Отслеживание . Мы будем использовать следующие клавиши на document.cookie и window.localStorage:

  • _ga : данные Google Analytics
  • __ utma : файл cookie для отслеживания Google Analytics
  • sid : SessionID

Убедитесь, что вы включили ссылки на свою Политику конфиденциальности и условия использования на всех страницах, которые используют отслеживание.

Где я могу хранить свои данные сеанса?

Вы можете сохранить свои данные сеанса в базе данных вашего веб-сайта или на компьютере пользователя. Поскольку я обычно работаю на небольших сайтах (пусть более 10 тысяч непрерывных подключений), которые используют сторонние приложения (Google Analytics / Clicky / etc), лучше всего хранить данные на клиентском компьютере. Это имеет следующие преимущества:

  1. Нет поиска в базе данных / накладные расходы / загрузка / задержка / пробел / т. Д.
  2. Пользователь может удалять свои данные в любое время без необходимости писать мне раздражающие электронные письма.

и недостатки:

  1. Данные должны быть зашифрованы / расшифрованы и подписаны / проверены, что создает накладные расходы процессора на клиенте (не так уж плохо) и сервере (ба!).
  2. Данные удаляются, когда пользователь удаляет свои куки и кеш. (это то, что я действительно хочу)
  3. Данные недоступны для аналитики, когда пользователи отключаются. (аналитика только для пользователей, просматривающих в настоящее время)

UUIDs

  • BrowserID : уникальный идентификатор, сгенерированный из строки пользовательского агента браузера. Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
  • ComputerID : Генерируется из IP-адреса пользователя и сеансового ключа HTTPS. getISP(requestIP)|getHTTPSClientKey()
  • FingerPrintID : снятие отпечатков на основе JavaScript на основе измененного fingerprint.js . FingerPrint.get()
  • SessionID : случайный ключ, генерируемый при первом посещении сайта пользователем. BrowserID|ComputerID|randombytes(256)
  • GoogleID : Сгенерировано из __utma cookie. getCookie(__utma).uniqueid

Механизм

На днях я смотрел шоу Венди Уильямс с моей подругой и был в полном ужасе, когда хозяин посоветовал своим зрителям удалять историю браузера по крайней мере раз в месяц. Удаление истории браузера обычно имеет следующие эффекты:

  1. Удаляет историю посещенных веб-сайтов.
  2. Удаляет куки и window.localStorage (aww man).

Большинство современных браузеров делают эту опцию доступной, но не бойтесь друзей. Ибо есть решение. В браузере есть механизм кэширования для хранения скриптов / изображений и прочего. Обычно, даже если мы удаляем нашу историю, этот кеш браузера остается. Все, что нам нужно, это способ хранения наших данных здесь. Есть 2 способа сделать это. Лучше использовать SVG-изображение и хранить наши данные в его тегах. Таким образом, данные могут быть извлечены, даже если JavaScript отключен с помощью Flash. Однако, поскольку это немного сложно, я продемонстрирую другой подход, который использует JSONP ( Wikipedia )

example.com / assets / js / tracking.js (фактически tracking.php)

var now = new Date();
var window.__sid = "SessionID"; // Server generated

setCookie("sid", window.__sid, now.setFullYear(now.getFullYear() + 1, now.getMonth(), now.getDate() - 1));

if( "localStorage" in window ) {
  window.localStorage.setItem("sid", window.__sid);
}

Теперь мы можем получить наш сеансовый ключ в любое время:

window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""

Как сделать, чтобы tracking.js вставлялся в браузер?

Этого можно добиться, используя Cache-Control , Last-Modified и ETag HTTP-заголовки. Мы можем использовать SessionID как значение для заголовка etag:

setHeaders({
  "ETag": SessionID,
  "Last-Modified": new Date(0).toUTCString(),
  "Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})
Заголовок

Last-Modified сообщает браузеру, что этот файл практически никогда не изменяется. Cache-Control говорит прокси и шлюзам не кэшировать документ, но велит браузеру кэшировать его в течение 1 года.

В следующий раз, когда браузер запросит документ, он отправит заголовки If-Modified-Since и If-None-Match. Мы можем использовать их для возврата 304 Not Modified ответа.

example.com / активы / JS / tracking.php

$sid = getHeader("If-None-Match") ?: getHeader("if-none-match") ?: getHeader("IF-NONE-MATCH") ?: ""; 
$ifModifiedSince = hasHeader("If-Modified-Since") ?: hasHeader("if-modified-since") ?: hasHeader("IF-MODIFIED-SINCE");

if( validateSession($sid) ) {
  if( sessionExists($sid) ) {
    continueSession($sid);
    send304();
  } else {
    startSession($sid);
    send304();
  }
} else if( $ifModifiedSince ) {
  send304();
} else {
  startSession();
  send200();
}

Теперь каждый раз, когда браузер запрашивает tracking.js, наш сервер ответит результатом 304 Not Modified и принудительно выполнит локальную копию tracking.js.

Я до сих пор не понимаю. Объясни мне

Предположим, пользователь очищает свою историю просмотров и обновляет страницу. Единственное, что осталось на компьютере пользователя - это копия tracking.js в кеше браузера. Когда браузер запрашивает tracking.js, он получает ответ 304 Not Modified, который заставляет его выполнить первую версию tracking.js, которую он получил. tracking.js выполняет и восстанавливает SessionID, который был удален.

Проверка

Предположим, Haxor X крадет файлы cookie наших клиентов, пока они еще вошли в систему. Как мы защищаем их? Криптография и браузер снимают отпечатки пальцев на помощь. Помните, что наше первоначальное определение для SessionID было:

BrowserID|ComputerID|randomBytes(256)

Мы можем изменить это на:

Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)

Где hk = sign(Timestamp|BrowserID|ComputerID, serverKey).

Теперь мы можем проверить наш SessionID, используя следующий алгоритм:

if( getTimestamp($sid) is older than 1 year ) return false;
if( getBrowserID($sid) !== createBrowserID($_Request, $_Server) ) return false;
if( getComputerID($sid) !== createComputerID($_Request, $_Server) return false;

$hk = sign(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid), $SERVER["key"]);

if( !verify(decrypt(getRandomBytes($sid)), getSignature($sid), $hk) ) return false;

return true; 

Теперь, чтобы атака Хаксора сработала, они должны:

  1. Иметь такой же ComputerID. Это означает, что у них должен быть тот же поставщик услуг Интернета, что и у жертвы (Tricky). Это даст нашей жертве возможность подать в суд на свою страну. Хаксор также должен получить ключ сеанса HTTPS от жертвы (Hard).
  2. Иметь такой же BrowserID. Любой может подменить строку User-Agent (раздражает).
  3. Уметь создавать собственную фальшивку SessionID (Очень сложно). Объемные атаки не будут работать, потому что мы используем временную метку для генерации ключа шифрования / подписи, так что в основном это похоже на генерацию нового ключа для каждой сессии. Кроме того, мы шифруем случайные байты, поэтому о простой атаке по словарю также не может быть и речи.

Мы можем улучшить валидацию, перенаправив GoogleID и FingerprintID (через ajax или скрытые поля) и сопоставив с ними.

if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
21 голосов
/ 13 мая 2012

Вы можете попробовать установить уникальный идентификатор в evercookie (он будет работать в разных браузерах, см. Их часто задаваемые вопросы): http://samy.pl/evercookie/

Существует также компания ThreatMetrix, которая используется многими крупными компаниями для решения этой проблемы: http://threatmetrix.com/our-solutions/solutions-by-product/trustdefender-id/ Они довольно дорогие, а некоторые другие их продукты не очень хороши, но их идентификатор устройства работает хорошо.

Наконец, есть реализация jquery с открытым исходным кодом идеи panopticlick: https://github.com/carlo/jquery-browser-fingerprint Это выглядит довольно наполовину испеченным прямо сейчас, но могло бы быть расширено.

Надеюсь, это поможет!

20 голосов
/ 16 июня 2015

В этой научной статье описан популярный метод, называемый отпечатками пальцев: Сеть никогда не забывает: Постоянные механизмы слежения в дикой природе . Когда вы начнете искать его, вы будете удивлены, как часто он используется. Этот метод создает уникальный отпечаток, который соответствует каждой комбинации браузера и оборудования.

В статье также рассматриваются другие постоянные методы отслеживания, такие как evercookies, восстановление файлов cookie http и Flash и синхронизация cookie.

Подробнее о снятии отпечатков на холсте здесь:

10 голосов
/ 19 октября 2008

Существует только небольшое количество информации, которую вы можете получить через HTTP-соединение.

  1. IP - Но, как говорили другие, это не исправлено для многих, если не для большинства пользователей Интернета, из-за политики динамического распределения их ISP.

  2. Useragent String - Почти все браузеры отправляют, какие они браузеры, при каждом запросе. Однако это может быть установлено пользователем во многих браузерах сегодня.

  3. Коллекция полей запроса - есть другие поля, отправляемые с каждым запросом, такие как поддерживаемые кодировки и т. Д. Они, если они используются в совокупности, могут помочь идентифицировать компьютер пользователя, но опять-таки зависят от браузера и могут быть изменено.

  4. Cookies - установка cookie - это еще один способ идентифицировать машину или, точнее, браузер на машине, но, как говорили другие, они могут быть удалены или отключены пользователями и применимы только к в браузере, а не в машине.

Таким образом, правильный ответ заключается в том, что вы не можете достичь того, что бы вы жили, используя только протоколы HTTP over IP. Однако, используя комбинацию файлов cookie, а также IP-адреса и полей в HTTP-запросе, у вас есть хороший шанс угадать, что это за машина. Пользователи, как правило, используют только один браузер, и часто с одного компьютера, так что это может быть довольно надежным, но это будет зависеть от аудитории ... техники, скорее всего, возятся с этим и используют больше машин / браузеров. Кроме того, это может даже сочетаться с некоторой попыткой определить местоположение IP и использовать эти данные. Но в любом случае, не существует решения, которое всегда будет правильным.

9 голосов
/ 28 августа 2012

Существуют недостатки как с использованием cookie, так и без использования cookie. Но если вы можете простить недостатки подхода cookie, вот идея.

Если вы уже используете Google Analytics на своем сайте, вам не нужно писать код для отслеживания уникальных пользователей самостоятельно. Google Analytics делает это для вас с помощью файла cookie __utma, как описано в документации Google . И, повторно используя это значение, вы не создаете дополнительную полезную нагрузку на cookie, что дает преимущества в эффективности при запросах страниц.

И вы могли бы достаточно легко написать некоторый код для доступа к этому значению или использовать функцию getUniqueId() этого скрипта.

8 голосов
/ 19 октября 2008

Как и в предыдущих решениях, файлы cookie являются хорошим методом, однако имейте в виду, что они идентифицируют браузеры . Если бы я посетил веб-сайт в Firefox, а затем в Internet Explorer, куки будут храниться для обеих попыток отдельно. Некоторые пользователи также отключают файлы cookie (но все больше людей отключают JavaScript).

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

6 голосов
/ 29 октября 2008

Когда я использую устройство, которое никогда не посещало мой веб-сайт онлайн-банкинга, меня просят о дополнительной аутентификации. затем, если я возвращаюсь во второй раз на сайт онлайн-банкинга, меня не спрашивают о дополнительной аутентификации ... я удалил все куки-файлы в IE и перезагружен на мой сайт онлайн-банкинга, ожидая, что мне снова будут заданы вопросы аутентификации. к моему удивлению, меня не спросили. разве это не заставляет поверить, что банк делает какие-то компьютерные теги, которые не включают куки?

Это довольно распространенный тип аутентификации, используемый банками.

Скажем, вы заходите на сайт своего банка через example-isp.com. При первом посещении вас попросят ввести пароль и дополнительную аутентификацию. Как только вы уйдете, банк узнает, что пользователь «thatisvaliant» аутентифицирован для доступа к сайту через example-isp.com.

В будущем он не будет запрашивать дополнительную аутентификацию (помимо вашего пароля), когда вы заходите на сайт через example-isp.com. Если вы попытаетесь получить доступ к банку через another-isp.com, банк снова выполнит ту же процедуру.

Итак, подведем итог: банк идентифицирует вашего интернет-провайдера и / или сетевой блок на основе вашего IP-адреса. Очевидно, что не каждый пользователь в вашем интернет-провайдере - это вы, поэтому банк все еще запрашивает ваш пароль.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...