Уникальные IP-адреса в системе голосования
Я создаю систему голосования для своего сайта PHP/MySQL, и я хотел бы убедиться, что один пользователь может голосовать только один раз. Что было бы хорошим способом сделать это? До сих пор я думал и наполовину реализовал следующее:
Хранение отдельных голосов в базе данных с IP и голосованием. Это создает громоздкость, но гарантирует, что каждый пользователь получает один голос.
Хранение куки на конце пользователя, чтобы проверить, проголосовали ли они или нет. Это самое простое, но, очевидно, пользователи могут просто отключить куки.
Какой подход был бы наиболее практичным? Любые другие предложения приветствуются.
7 ответов
Невероятно совершенный: (Уникальный номер правительства)
- Пользователь голосует, используя проверяемый уникальный идентификатор, такой как номер социального страхования или номер паспорта
Достаточно близко для реальности: (электронная почта / сторонняя аутентификация)
- Пользователь регистрирует учетную запись с адресом электронной почты и паролем (или Google/ Facebook)
- 1 адрес электронной почты = 1 голос
- Пользователи не могут очистить куки и получить дополнительные голоса, приложение не закрывает тысячи с общими IP-адресами
Хорошая мысль, но ложное притворство (IP-адреса)
- Офисные здания: 1000 пользователей по одному и тому же внешнему IP заблокированы
- Университеты: подключение к беспроводной связи в классе. Голос. Перейти в следующий класс. Подключитесь и проголосуйте снова
Crash-and-Burn (печенье)
- Голос
- Ctrl Shft Del Enter
- голос
- повторение
Вы должны хранить как можно больше информации в базе данных, если хотите иметь возможность проводить аудит вашей системы. Если вы много входите в систему, то даже в случае фальсификации голосования вы сможете обнаружить ее и отменить эти голоса.
Второй метод совершенно небезопасен. Пользователи могут просто удалить куки, если они хотят проголосовать снова, и у вас не будет возможности обнаружить, что это произошло.
Важная заметка
Не существует однозначного сопоставления между IP-адресами людей. Некоторые люди имеют много IP-адресов, в то время как другие люди используют один IP-адрес.
Полностью надежный способ будет хитрым. Обе ваши идеи имеют проблемы - куки могут быть отключены, и один пользователь может иметь много IP-адресов и / или много пользователей могут использовать один и тот же IP-адрес. Было бы лучше заставить своих пользователей зарегистрироваться и разрешить только один голос за зарегистрированную учетную запись, но тогда кто-то может подписаться на несколько учетных записей. Принудительная проверка уникальности электронной почты для каждой учетной записи несколько уменьшает это, но вы все равно можете обойти это, подписавшись на несколько разных писем.
По сути, каждая мера, которую вы принимаете, усложняет процесс обхода, но в то же время увеличивает нагрузку на голосование вообще. За исключением привязки голосов к чему-то известному уникальному (SSN, номер паспорта), который может быть проверен, любая мера, которую вы введете в действие, может быть обойдена, это просто зависит от того, сколько усилий она затрачивает. Хотя проверка подозрительно выглядящих голосований вручную поможет уменьшить количество мошеннических голосов в дополнение к другим мерам. То, где вы проводите грань между простотой использования и безопасностью, зависит только от вас, в зависимости от того, насколько вам нужно обеспечить ограничение в один голос.
Как сказал Марк Байерс, в некоторых странах могут быть динамические IP-адреса (например, Вьетнам), поэтому IP-адреса будут постоянно меняться каждый раз, когда пользователь устанавливает соединение (или сбрасывает модем). Но если вы можете убедиться, что ваша система построена в стране, где IP-адреса являются статическими, то это нормально.
Решение для файлов cookie кажется немного небезопасным, но если большинство ваших пользователей не являются техническими специалистами, то они не смогут распознать хитрость (то есть удалить файлы cookie и проголосовать снова). Для меня я не предпочитаю этот путь, пока я знаю, что мои пользователи ничего не знают об этой технике.
Я предлагаю вам иметь email verification
для опроса, так что результаты будут более точными. У пользователя может быть только несколько адресов электронной почты, и он не хочет создавать новые, чтобы голосовать.
Что бы вы ни выбрали, IP-адреса не будут защищены вообще. Пользователь может получить доступ из другого места и снова голосовать. Cookie - это решение, но не оптимизированное из-за возможности удаления (так что вы рискуете процессом распознавания пользователя). Вам нужно будет обрабатывать больше данных от пользователя, чтобы иметь возможность надежно записывать их параметры.
если система является подсистемой большей системы, возможно, вы можете использовать поле, которое является общим в большей системе, для идентификации пользователей в текущей системе.
Надеюсь это поможет,
Единственный способ убедиться, что пользователи проголосовали только один раз, - это создать учетные записи пользователей.
Печенье можно стереть
IP-адрес предназначен для изменения. (также несколько пользователей могут иметь один IP-адрес)
Хранение отдельных голосов в базе данных с IP и голосованием. Это создает громоздкость, но гарантирует, что каждый пользователь получает один голос.
Это хорошо, но медленно, чем 2-й, но все же я рекомендую это.
Хранение куки на конце пользователя, чтобы проверить, проголосовали ли они или нет. Это самое простое, но, очевидно, пользователи могут просто отключить куки.
Вы правы, это небезопасно, но немного быстрее, но мне это не нравится