Как избежать, чтобы пользователь удалял свой сеанс

Вариант использования

В настоящее время я пытаюсь создать страницу, где пользователи могут голосовать за контент (вверх / downvote, аналогично функции в сети StackExchange). Но пользователям не нужно регистрироваться, чтобы голосовать за контент. Так что это будет своего рода страница анонимного голосования. Он построен на Laravel5 и использует базу данных MySQL для хранения голосов. Пользовательские сеансы хранятся в плоских файлах, но могут также храниться в таблице базы данных (L5 здесь достаточно гибок).


Эта проблема

Как сделать это безопасно?.

Я сохраняю ограничения и уже проголосованное содержимое в пользовательских сессиях, например, когда пользователь проголосовал за контент XYZ (таким образом, пользователь не может снова голосовать за конкретный контент на данный момент). Эти ограничения основаны на времени, в основном от 24 до 48 часов. Это хорошо работает, до тех пор, пока пользователь не выбрасывает / не удаляет свои куки, что приведет к созданию нового сеанса и снятию ограничений по времени, что может привести к легкое мошенничество при голосовании.

Итак, как избежать того, чтобы пользователь «терял» свою сессию? Основное внимание уделяется тому, как сохранить ограничения и ограничения каждого «анонимного» пользователя! Общие компьютеры или голосование в разных местах не могут быть исключены при голосовании анонимно, но с помощью данного решения следует избегать «ботов» или фальсификаций голосования в больших количествах.


Попытки решения

Установка sessionId каждого сеанса пользователя на комбинацию IP и
User-Agent

Я задал вопрос об этой попытке (ссылка ниже), но это откроет больше проблем, чем решит (например, простое подделывание сессии). Кроме того, я не смог добиться установки sessionID вручную с помощью Laravel5.


Решения, которые не подходят

  • Пусть каждый пользователь зарегистрирует себя (это просто слишком много усилий для каждого пользователя в моем случае использования)

связанные с

2

Решение

поскольку пользователи не хранятся и не обслуживаются, это очень сложно и не может быть на 100% уверенным.

Как я пытаюсь достичь этого наиболее близко, используя IP-адрес запроса и токен CSRF.
Вы можете получить IP-адрес из запроса и csrf_token() из любой точки вашего приложения Laravel.

вот пример того, как я собираюсь реализовать

создайте таблицу с именами голосов, имеющую следующие поля

  • votable_type
  • votable_id
  • айпи адрес
  • csrf_token

я бы проверил, нет ли у клиента существующей записи для того же типа голоса и идентификатора. клиент — это csrf_token. ip предназначен для гарантии законности запросов.

votable type и id — это полиморфные отношения между комментариями, постами и т. д.

нота

без сохранения идентификации пользователя в любом случае некоторые пользователи могут не участвовать в голосовании, а некоторые могут голосовать дважды. это не может быть сделано
в совершенстве.

  • некоторые пользователи могут голосовать от нескольких
    раз.
  • некоторые пользователи могут подделать ip. очистить печенье
  • разные пользователи могут использовать один и тот же
    Система для входа.
  • некоторые пользователи могут использовать разные соединения или
    системные логины.

так что либо мы берем любую информацию, это не будет 100%
точный.

1

Другие решения

Мое решение было сочетание реализации evercookie назначить «идентификационный файл cookie» для каждого пользователя, обнаружение конфиденциальности просмотра и ограничить доступ, когда включен режим инкогнито или приватный просмотр, и, наконец, ограничить несколько действий (голосование в моем случае), если у вас нет evercookie.

0

По вопросам рекламы [email protected]