Я создаю систему голосования для моего сайта PHP / MySQL, и я хотел бы убедиться, что один пользователь может голосовать только один раз. Что было бы хорошим способом сделать это? До сих пор я думал и полу-реализовал следующее:
Сохранение индивидуальных голосов в базе данных с использованием IP и голосование. Это создает громоздкость, но гарантирует, что каждый пользователь получает один голос.
Хранение файла cookie на конце пользователя, чтобы проверить, голосовали ли они или нет. Это самый простой, но, очевидно, пользователи могут просто отключить файлы cookie.
Какой был бы самый практичный подход? Любые другие предложения более чем приветствуются.
Недостижимо-совершенное: (уникальный номер правительства)
Близкое для реальности: (электронная почта / сторонняя аутентификация)
Хорошая мысль-но-ложь-предлог (IP-адреса)
Crash-And-Burn (Cookies)
Вы должны хранить как можно больше информации в базе данных, если хотите иметь возможность проверить свою систему. Если вы запишете много, то даже если есть мошенничество с голосованием, вы можете обнаружить его и отменить эти голоса.
Второй метод совершенно небезопасен. Пользователи могут просто удалить файл cookie, если они захотят снова проголосовать, и вы не сможете обнаружить, что это произошло.
Важная заметка
Нет однозначного сопоставления между IP-адресами людей. У некоторых людей много IP-адресов, в то время как другие люди используют один IP-адрес.
Полностью надежный путь будет сложным. У обоих ваших идей есть проблемы – файлы cookie могут быть отключены, и у одного пользователя может быть много IP и / или многие пользователи могут использовать один и тот же IP-адрес. Заставлять ваших пользователей регистрироваться и разрешать только один голос на зарегистрированную учетную запись будет лучше, но тогда кто-то может зарегистрироваться для нескольких учетных записей. Принудительная проверка подлинности электронной почты для каждой учетной записи несколько уменьшает ее, но вы все равно можете обойти ее, подписавшись на несколько разных электронных писем.
В основном, каждая мера, которую вы принимаете, затрудняет передвижение, но также усиливает усилия по голосованию вообще. Если не считать привязки голосов к чему-то известному уникальному (SSN, номер паспорта), который может быть проверен, любая мера, которую вы вводите в действие, может быть обойдена, это зависит только от того, насколько это необходимо. В ручном порядке рассмотрение подозрительных голосов может помочь уменьшить количество мошеннических голосов, хотя в дополнение к другим мерам. Там, где вы нарисовали линию между простотой использования и безопасностью, зависит от вас, в зависимости от того, сколько вам нужно, чтобы обеспечить ограничение на один голос.
Как отметил Марк Байерс, в некоторых странах могут быть динамические IP-адреса (например, Вьетнам), поэтому IP-адреса будут постоянно меняться каждый раз, когда пользователь устанавливает соединение (или перезагружает модем). Но если вы можете убедиться, что ваша система построена в стране, где IP-адреса статичны, то это нормально.
Решение для файлов cookie кажется немного ненадежным, но если большинство ваших пользователей являются нетехническими людьми, они не смогут распознать трюк (который должен удалить файлы cookie и снова проголосовать). Для меня я не предпочитаю этого, пока знаю, что мои пользователи ничего не знают об этой технике.
Я предлагаю вам email verification
для опроса, чтобы результаты были более точными. У пользователя может быть только несколько адресов электронной почты, и они не хотят создавать новые, чтобы голосовать.
Сохранение индивидуальных голосов в базе данных с использованием IP и голосование. Это создает громоздкость, но гарантирует, что каждый пользователь получает один голос.
Это хорошо, но медленнее второго, но все же я рекомендую это.
Хранение файла cookie на конце пользователя, чтобы проверить, голосовали ли они или нет. Это самый простой, но, очевидно, пользователи могут просто отключить файлы cookie.
вы правы, это небезопасно, но немного быстрее, но мне это не нравится
Независимо от того, что вы решаете, IP-адреса не будут безопасными вообще. Пользователь может в основном получить доступ из другого места и снова проголосовать и т. Д. Cookie – это решение, но не оптимизированное из-за возможности удаления (так что вы рискуете процессом распознавания пользователей). Вам нужно будет обрабатывать больше данных от пользователя, чтобы они могли безопасно записывать свой вариант.
если система является подсистемой более крупной системы, возможно, вы можете использовать поле, которое является общим в более крупной системе, для идентификации пользователей в текущей системе.
Надеюсь это поможет,
Единственный способ удостовериться, что пользователи голосуют только один раз, – это создание учетных записей пользователей. Потому что:
Печенье можно стереть
IP-адрес предназначен для изменения. (также у нескольких пользователей может быть один IP-адрес)