Способы создания уникального отпечатка пальца пользователя в PHP

Каков наилучший способ создать «отпечаток пальца» уникальности пользователя в PHP?

Например:

  1. Я мог бы использовать IP-адрес пользователя в качестве «отпечатка пальца», однако на одном и том же IP-адресе может быть несколько других пользователей.
  2. Я мог бы использовать IP-адрес пользователя + пользовательский агент в качестве «отпечатка пальца», однако один пользователь мог бы просто переключиться с Safari на Firefox и снова считаться уникальным.

В идеале отпечаток пальца должен обозначать «машину», а не браузер или «ip», но я не могу придумать, как это достижимо.

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


person So Over It    schedule 03.11.2010    source источник
comment
Этот сайт охватывает почти всю информацию, которую вы можете использовать, чтобы различать людей через браузер. panopticlick.eff.org JavaScript, Java и Flash очень помогают.   -  person JAL    schedule 03.11.2010
comment
старый вопрос, но это: md5(implode('',$_SERVER));   -  person Shea    schedule 27.09.2011
comment
@Shea Полезный комментарий, но отпечатки пальцев не меняются (метафорически говоря), и в $_SERVER будут вариации, не связанные с пользователем us1.php.net/reserved.variables.server   -  person PJ Brunet    schedule 05.11.2013
comment
@Shea Я бы не стал использовать трюк, который вы предложили, как есть, потому что отпечаток пальца менялся бы на каждой посещенной веб-странице. Но, возможно, его можно улучшить.   -  person Calimero    schedule 04.10.2017
comment
@Calimero Да, ты прав. Это полезно, но вам нужно отфильтровать определенные ключи.   -  person Shea    schedule 05.10.2017


Ответы (4)


Самый простой и лучший способ: используйте phps session-management - каждый клиент заданный идентификатор, хранящийся в файле cookie (если он включен) или указанный как переменная get для каждой ссылки и формы (в качестве альтернативы вы можете установить файл cookie самостоятельно). Но это только отпечатки пальцев браузера - если пользователь изменит свой браузер, удалит свои файлы cookie или что-то еще, вы больше не сможете его идентифицировать.

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

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

  • обычные HTTP-куки
  • Локальные общие объекты (Flash Cookies)
  • Хранение файлов cookie в значениях RGB автоматически сгенерированных, принудительно кэшированных файлов PNG с использованием тега Canvas HTML5 для обратного чтения пикселей (файлов cookie).
  • Сохранение файлов cookie и чтение истории веб-поиска
  • Хранение файлов cookie в HTTP ETags
  • Хранилище пользовательских данных Internet Explorer
  • Хранилище сеансов HTML5
  • Локальное хранилище HTML5
  • Глобальное хранилище HTML5
  • Хранилище базы данных HTML5 через SQLite

Существует решение под названием evercookie, которое реализует все это.

person oezi    schedule 03.11.2010
comment
Вы ссылаетесь на немецкий перевод руководства по PHP... Вот та же страница на английском языке: php.net/manual/en/book.session.php -- Кроме того, использование Evercookie или любого другого способа хранения данных на клиенте с явной целью затруднить удаление, вероятно, быть незаконным в большинстве стран. - person Adrian Schmidt; 24.01.2011

Достижение 100% надежности не гарантируется, но сочетание некоторых распространенных методов может дать вам значимые результаты.

  • Пользователи обычно не переключают браузеры. Чрезмерное усложнение вашего алгоритма только для достижения инженерного совершенства не стоит затраченных усилий.
  • Вы, безусловно, входите в топ-100 веб-сайтов, если можете ожидать нескольких пользователей с одного и того же IP-адреса. Не принимай это близко к сердцу, но ты просто не настолько популярен.

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

person pestaa    schedule 03.11.2010
comment
Я полностью не согласен с вашим вторым пунктом - в зависимости от того, какой у него сайт, вы очень быстро получите несколько пользователей с одним и тем же IP. скажем, его сайт — браузерная игра: все школьники рассказывают друг другу, друзья играют вместе, а на уроке информатики, где есть интернет, все играют в эту игру из школьной сети (что означает: тот же ip, но разработчик должен выяснить, является ли это одним и тем же компьютером, чтобы знать, что это не мошеннический мультиаккаунт) - person oezi; 03.11.2010
comment
@oezi Такая браузерная игра отлично справится с идентификаторами сеанса. - person pestaa; 03.11.2010
comment
действительно, я просто хотел привести пример, почему нельзя полагаться на ip-адрес даже на небольших сайтах. - person oezi; 03.11.2010
comment
Да, я бы хотел, чтобы мои сайты пользовались популярностью. При этом небольшое веб-приложение, которое у меня есть, работает на крошечном VPS (80 МБ ОЗУ — да!) — поэтому его не нужно слишком много перегружать. Мне нужно обеспечить справедливое использование для каждого пользователя. - person So Over It; 04.11.2010
comment
@So Over It: Имея так мало ресурсов, я бы сосредоточился на ядре своего приложения, а не на гайках и болтах, которые можно добавить позже. - person pestaa; 04.11.2010
comment
@oezi да, вы правы, любые компьютерные дома с внутренней сетью - офисы, школы, больницы, торговые центры (бесплатный Wi-Fi для клиентов), ... - person jave.web; 03.07.2018

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

person jmserra    schedule 12.12.2011

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

Я рекомендую вам использовать другой подход. Судите на основе имеющейся у вас неубедительной информации, которая предполагает личность вашего заблокированного пользователя (тот же IP-адрес или тот же пользовательский агент, если он необычный, или же некоторые методы снятия отпечатков пальцев браузера javascript, такие как доступные шрифты, доступные плагины, нестандартные размер окна и т. д.) и требовать от этих подозрительных посетителей какой-либо более высокой формы проверки личности — например, oauth с Facebook, Google+ или Twitter. Затем вы можете проверить, является ли эта учетная запись в социальной сети подлинной или создана только для обхода. Существуют также API-интерфейсы для проверки телефона на случай, если ваша пользовательская база не разбирается в социальных сетях, и в зависимости от того, насколько ценным для вас является то, что пользователи не могут обойти блокировку.

person Thoracius Appotite    schedule 11.03.2017