Я работаю над PHP-скриптом, который позволяет пользователям голосовать по определенным элементам. Любой пользователь, будь то вход в систему или нет, может голосовать. Рассмотрим следующие случаи:
Если это первый случай, нет необходимости регистрировать IP-адрес. Теперь второй случай заводит меня в орехи, вроде как. Мне было интересно, что может случиться так, что пользователь может менять IP-адрес, а затем снова голосует на одном и том же элементе. Теперь, даже если я использую Cookies или Session vars, также может случиться так, что пользователь начинает новый сеанс (или удалил файлы cookie), чтобы снова проголосовать за один и тот же элемент.
Я что-то упускаю? Если нет, как справиться с такими ситуациями? Есть предположения?
Я бы серьезно подумал о использовании Captcha, reCaptcha – хороший выбор.
Вы можете ограничить по IP-адресу, но его возможно для нескольких людей, чтобы разделить 1 ip-адрес, например, небольшую школу или бизнес. Его также тривиально обходить, поскольку прокси-серверы являются бесплатными и многочисленными. Его также подвержена ошибкам, потому что иногда балансировка нагрузки меняет IP-адрес во время сеанса. Если вы действительно хотите ограничить количество голосов на человека, лучший выбор – потребовать от них входа в учетную запись пользователя и сохранения голосов в вашей базе данных.
Во-первых, есть несколько способов захватить IP-адрес клиента с помощью PHP. Вот 3 метода, о которых я знаю:
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR']; } else if (isset($_SERVER['HTTP_CLIENT_IP'])) { $ipAddress = $_SERVER['HTTP_CLIENT_IP']; } else if (isset($_SERVER['REMOTE_ADDR'])) { $ipAddress = $_SERVER['REMOTE_ADDR']; }
Во-вторых, если вас беспокоит энергозависимое хранилище, такое как файлы cookie или сеансы, лучше всего иметь таблицу базы данных, в которой хранятся эти значения. Это может быть простая таблица с тремя столбцами: client_ip, item_id и date_created. Это позволит вам отслеживать, использовался ли конкретный IP-адрес для голосования по определенному элементу.
Теперь единственная проблема, с которой я вижу, заключается в том, что клиент работает и сидит за прокси-сервером. Итак, я думаю, у вас есть несколько вариантов, каждый из которых имеет свои плюсы и минусы.
Вы можете попробовать использовать evercookie , его трудно понять