Простая система голосования: как предотвратить дублирование голосов

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

В моем веб-приложении используется javascript и firebase для загрузки всех объектов, на которые проголосовали. Я собираюсь заставить пользователя войти в систему и сохранить IP-адреса, идентификаторы пользователей и т.д.

Вопросы:

  • Является ли это фундаментальным недостатком с самого начала для использования javascript? Я вижу большой потенциал для написания script, который просто меняет значения и переголосовает. (возможно, я могу проверить, что данные переднего конца верны и что пользователь существует с вызовом ajax?)
  • С шансом off-beat мое приложение становится успешным. Это будет слишком много вычислений на передней панели?

Edit: Извините, но я оставил ключевой факт, что у меня есть большая задняя система (WordPress), которая обрабатывает аутентификацию. Приложение, над которым я работаю, в значительной степени независим от wordpress. Я просто извлекаю некоторую информацию о пользователях для целей фильтрации. Я выбрал Firebase в качестве хранилища для своих функций в реальном времени.

Я надеюсь бороться с мошенничеством с помощью нескольких методов:

  • низкое вознаграждение $100/month отдано.
  • не входит в компромисс, я на самом деле хочу, чтобы пользователи были зарегистрированы и проверены глазами человека, чтобы иметь право голоса. Другие могут засвидетельствовать конкурс, но не могут голосовать.
  • проверки на стороне сервера. Если мое приложение получает популярность, я могу писать сценарии для отслеживания шаблонов голосования для нарушений? если кто-то злоупотребляет системой, я отключу их способность побеждать.

Ответ 1

Конечно, это можно сделать на стороне клиента. Тем не менее, как отмечают другие, он требует от пользователей входа в систему. Если вы уже используете Firebase, на самом деле это довольно легко реализовать с помощью FirebaseAuthClient.

Затем вы можете связать это с правилами безопасности Firebase, чтобы обеспечить соблюдение того, что любой зарегистрированный пользователь может только один раз повышать. Посмотрите скринкаст на странице безопасности на примере!

Ваши правила безопасности могут выглядеть так:

{
  "rules": {
    "users:" {
      "$userid": {
        "voted_on": {
          "$articleid": {
            ".write": "!data.exists()"
          }
        }
      }
    }
  }
}

Это гарантирует, что вы можете написать любое заданное значение /users/anant/voted _on/article1 ровно один раз. Вы можете добавить правило .validate, чтобы убедиться, что значение является логическим (или что-то еще).

Ответ 2

Это то, что вы, вероятно, должны делать:

1) Как только пользователь проголосует, вы должны сделать ajax-вызов на сервере и обновить флаг в базе данных и отключить голосование с помощью javascript.

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

3) Если пользователь пытается включить голосование с помощью хром-инструментов или firebug путем изменения источника страницы, вы можете создать проверку на конец базы данных, установив составной ключ на идентификаторе пользователя и "проголосовать" ", который предотвратит дублирование голосов.

Надеюсь, что это поможет.

Ответ 3

Невозможно предотвратить дублирование голосов, но заставлять пользователей регистрироваться (возможно, с подтверждением электронной почты) и аутентифицироваться (таким образом, хранить голоса где-то в вашей БД и проверять). Другие методы ошибочны:

  • cookie/session storage можно отключить или очистить, когда пользователь захочет.
  • Отслеживание IP-адресов предотвращает использование за NAT, прокси и шлюзы, поскольку все клиенты будут использовать один и тот же общий адрес (или небольшое число).

Тем не менее, пользователь может регистрировать несколько учетных записей, и нет возможности предотвратить это.

То, что вы можете сделать, это обнаружить быстрые последовательности действий по голосованию, которые могут быть сгенерированы скриптами.

Ответ 4

Воспользовавшись OAuth, очень маловероятно, что пользователи не могут найти способ входа в систему через FB/Twitter/Google/OpenID.

По-прежнему дешево и быстро голосовать, и в случае, если пользователь не хочет входить в систему через сторонние службы, вы можете предоставить резерв электронной почты.

Как уже отмечалось, вы должны полагаться на собственный сервер.