В настоящее время я пытаюсь создать страницу, где пользователи могут голосовать за контент (вверх / downvote, аналогично функции в сети StackExchange). Но пользователям не нужно регистрироваться, чтобы голосовать за контент. Так что это будет своего рода страница анонимного голосования. Он построен на Laravel5 и использует базу данных MySQL для хранения голосов. Пользовательские сеансы хранятся в плоских файлах, но могут также храниться в таблице базы данных (L5 здесь достаточно гибок).
Как сделать это безопасно?.
Я сохраняю ограничения и уже проголосованное содержимое в пользовательских сессиях, например, когда пользователь проголосовал за контент XYZ (таким образом, пользователь не может снова голосовать за конкретный контент на данный момент). Эти ограничения основаны на времени, в основном от 24 до 48 часов. Это хорошо работает, до тех пор, пока пользователь не выбрасывает / не удаляет свои куки, что приведет к созданию нового сеанса и снятию ограничений по времени, что может привести к легкое мошенничество при голосовании.
Итак, как избежать того, чтобы пользователь «терял» свою сессию? Основное внимание уделяется тому, как сохранить ограничения и ограничения каждого «анонимного» пользователя! Общие компьютеры или голосование в разных местах не могут быть исключены при голосовании анонимно, но с помощью данного решения следует избегать «ботов» или фальсификаций голосования в больших количествах.
Установка sessionId каждого сеанса пользователя на комбинацию IP и
User-Agent
Я задал вопрос об этой попытке (ссылка ниже), но это откроет больше проблем, чем решит (например, простое подделывание сессии). Кроме того, я не смог добиться установки sessionID вручную с помощью Laravel5.
поскольку пользователи не хранятся и не обслуживаются, это очень сложно и не может быть на 100% уверенным.
Как я пытаюсь достичь этого наиболее близко, используя IP-адрес запроса и токен CSRF.
Вы можете получить IP-адрес из запроса и csrf_token()
из любой точки вашего приложения Laravel.
вот пример того, как я собираюсь реализовать
создайте таблицу с именами голосов, имеющую следующие поля
я бы проверил, нет ли у клиента существующей записи для того же типа голоса и идентификатора. клиент — это csrf_token. ip предназначен для гарантии законности запросов.
votable type и id — это полиморфные отношения между комментариями, постами и т. д.
нота
без сохранения идентификации пользователя в любом случае некоторые пользователи могут не участвовать в голосовании, а некоторые могут голосовать дважды. это не может быть сделано
в совершенстве.
- некоторые пользователи могут голосовать от нескольких
раз.- некоторые пользователи могут подделать ip. очистить печенье
- разные пользователи могут использовать один и тот же
Система для входа.- некоторые пользователи могут использовать разные соединения или
системные логины.так что либо мы берем любую информацию, это не будет 100%
точный.
Мое решение было сочетание реализации evercookie назначить «идентификационный файл cookie» для каждого пользователя, обнаружение конфиденциальности просмотра и ограничить доступ, когда включен режим инкогнито или приватный просмотр, и, наконец, ограничить несколько действий (голосование в моем случае), если у вас нет evercookie.