У меня есть задача создать опрос. Идея этого опроса должна быть видна на веб-сайте, но без пользователей. Вам не нужно регистрироваться, чтобы отвечать на опрос. Однако мне нужно сделать так, чтобы после голосования один раз вы не могли голосовать дважды. Это не очень сложно и что-то, что я часто видел на новостных сайтах.
Общее решение для этого – cookie. Вы храните информацию в cookie, и если они отправляют ответ, вы храните эту информацию в файле cookie, и все в порядке.
Однако я хочу сделать что-то еще лучше – я хочу сделать это, если вы откроете Chrome и проголосуете, а затем откройте Mozilla, вы не сможете снова проголосовать.
Первое, что пришло в голову, – это использовать IP-адрес, но тогда … что, если у вас несколько компьютеров на одном соединении? Как в большом офисном здании?
Это означает, что мне нужно что-то уникальное для одного конкретного компьютера независимо от его интернет-соединения.
Пришло в голову использовать что-то конкретное и уникальное для генерации идентификатора для файла cookie. Это означает, что, используя что-то уникальное, я создам идентификатор, который всегда будет одинаковым для конкретного компьютера, независимо от того, в каком браузере и вне зависимости от его соединения. Вы можете удалить файл cookie, а затем, когда я создам новый, он будет создан с тем же идентификатором, и я смогу узнать, что кто-то с этим компьютером уже проголосовал за опрос.
Мой вопрос – что уникально для компьютеров, к которым я могу получить доступ через браузер и как? Я использую PHP с Symfony и javascript для Front-end.
Снова я подытожу то, что хочу, – чтобы я мог распознать пользователя (компьютер) без входа в систему, даже если этот пользователь удалил все файлы cookie и переключил браузеры или находится в разных соединениях. Он может использовать VPN или переходить из одной страны в другую и переключать интернет-провайдеров или что-то в этом роде … пока он находится на одном компьютере и компьютер не получил изменений в торможении (исправления, обновления и т. Д.), Мне нужно это признать.
Единственный способ, которым я могу это представить, – использовать приложение Flash и использовать общий объект. Но это уродливо и легко можно победить, как куки. Короче говоря, вы ничего не можете манипулировать на стороне клиента, чтобы делать то, что вы предлагаете последовательным, надежным способом.
Это называется отпечатком пальца браузера.
Проверьте 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-холст в своем браузере, поэтому вам необходимо остановить их от отправки опроса, если данные отпечатка пальца пустого. Пользователи могут удалять и добавлять шрифты довольно легко, поэтому только шрифты не идеальны, но комбинация этих двух остановит любые основные попытки попыток отправить опрос несколько раз.