Как распознать пользователя из разных браузеров

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

Общее решение для этого - cookie. Вы сохраняете информацию в файле cookie, и если они отправляют ответ, вы храните эту информацию в файле cookie, и все хорошо.

Однако я хочу сделать что-то еще лучше - я хочу сделать это, если вы откроете Chrome и проголосуете, а затем откройте Mozilla, вы не сможете снова проголосовать.

Первое, что пришло в голову, - это использовать IP-адрес, но тогда... что, если у вас несколько компьютеров на одном соединении? Как в большом офисном здании?

Это означает, что мне нужно что-то уникальное для одного конкретного компьютера независимо от его интернет-соединения.

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

Мой вопрос - что уникально для компьютеров, к которым я могу получить доступ через браузер и как? Я использую PHP с Symfony и javascript для Front-end.

Снова я подытожу то, что хочу, - чтобы я мог распознать пользователя (компьютер) без входа в систему, даже если этот пользователь удалил все файлы cookie и переключил браузеры или находится в разных соединениях. Он может использовать VPN или переходить из одной страны в другую и переключать интернет-провайдеров или что-то в этом роде... пока он находится на одном компьютере и компьютер не получил изменений в торможении (исправления, обновления и т.д.), Мне нужно это признать.

Ответ 1

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

Отметьте https://browserleaks.com/ список тонны данных, которые вы можете получить о пользователе. Этот веб-сайт использует код на стороне клиента, который вы также можете использовать для получения всех данных, которые вы там видите, включая такие вещи, как:

- Какие шрифты они установили

- Какие ОС они используют

- их провайдер

- Какие плагины они установили

- Используя <canvas>, уникальный уникальный отпечаток сам по себе

- Разрешение экрана

и многое, многое другое, особенно если у пользователя есть Flash, WebGL или WebRTC. Используя эти данные, вы создаете "отпечаток пальца" пользователя в своей базе данных. Например, скажем, я посещаю ваш сайт; вы записываете все 322 шрифта, которые я установил, какую ОС у меня, кто мой интернет-провайдер, какие плагины, которые я установил, разрешение экрана и т.д. Когда я пытаюсь перейти на ваш сайт из другого браузера и даже другого IP, вы все еще точно знаете, кто я из всех других данных, которые вы собрали.

EDIT: учитывая комментарий duskwuff и downvote, я думаю, что я вынужден дать некоторые ссылки на исследования и результаты. Обратите внимание, что отпечаток пальца браузера не на 100% эффективен, поэтому его нельзя использовать как уникальный идентификатор, как в базе данных, чтобы полностью идентифицировать пользователя, но с использованием новейших технологий вы можете получить очень высокие показатели успеха. Большинство веб-сайтов используют его как для рекламы, так и по своему усмотрению, для защиты от спама:

https://panopticlick.eff.org/static/browser-uniqueness.pdf (эффективность 99.1%) http://yinzhicao.org/TrackingFree/crossbrowsertracking_NDSS17.pdf (эффективность 99.24%) http://mickvaites.com/wp-content/uploads/2013/09/T802_Michael_Vaites_2013-BrowserFingerprinting.pdf (эффективность 95%)

ИЗМЕНИТЬ 2: Чтобы реализовать это без дорогостоящих корпоративных продуктов SaaS: https://www.npmjs.com/package/fingerprintjs2 В разделе "Список источников отпечатков пальцев" вы увидите список разных частей данных, которые вы получите, когда пользователь посещает ваш сайт. Вы должны записывать эти данные в свою базу данных в любое время, когда кто-то отправляет опрос. Прежде чем разрешить подачу опроса, запросите свою базу данных для чего-то вроде "имеет ли кто-нибудь с этим же агентом пользователя, язык, глубину цвета... и т.д., Подал опрос в прошлом? Если да, это, вероятно, кто-то пытается отправить опрос дважды, поэтому не допускайте подачи". Это очень упрощенный способ сделать это и не будет работать очень хорошо; в идеальном мире вам понадобится сложный алгоритм, который будет проверять все точки данных и определять вероятность того, что пользователь будет таким же, как раньше. Например. возможно, они изменили свой часовой пояс, чтобы избавиться от обнаружения спама; если все точки совпадают, за исключением часового пояса, что легко обнаружить.

Простой способ реализовать это на достойном уровне точности: использовать отпечаток пальца + установленные шрифты. Фиксация пальцев очень точная и трудно подделать. То же самое с установленными шрифтами. Эти две части данных позволят вам получить довольно приличную систему обнаружения спама. Пользователи могут отключить html-холст в своем браузере, поэтому вам необходимо остановить их от отправки опроса, если данные отпечатка пальца пустого. Пользователи могут удалять и добавлять шрифты довольно легко, поэтому только шрифты не идеальны, но комбинация этих двух остановит любые основные вредоносные попытки отправки опроса несколько раз.

Ответ 2

Единственный способ, которым я могу это представить, - использовать приложение Flash и использовать общий объект. Но это уродливо и легко можно победить, как куки. Короче говоря, вы не можете манипулировать на стороне клиента, чтобы делать то, что вы предлагаете, настойчивым и надежным способом.