2013-05-31 4 views
10

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

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

Вопросы:

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

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

Я надеюсь, что для борьбы с мошенничеством избирателей с несколькими методами:

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

«Наличные вознаграждения» могут быть плохой идеей. Вы никогда, я не повторяю ** никогда **, чтобы быть в состоянии остановить людей от выхода и выкупить кучу прокси и виртуальных частных сетей для голосования. – mawburn

+0

Это кажется ошибочным с самого начала. Безопасность не может быть гарантирована на стороне клиента. – andre

+5

Как говорили другие, единственное, что полагается на JS для достижения этого, - это рецепт катастрофы. Вам понадобится включить некоторые серверные элементы. – Sethen

ответ

8

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

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

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

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

Это гарантирует, что вы можете написать любое данное значение/пользователей/Anant/voted_on/точно статье 1 раз. Вы можете добавить правило .validate, чтобы убедиться, что значение является логическим (или что-то еще).

+0

Мне это нравится, я собираюсь посмотреть, что он может сделать сегодня вечером! –

+0

Если вы хотите иметь дополнительный уровень безопасности, например проверку IP-адреса, чтобы помочь замедлить работу пользователей от дублирования учетных записей, вы можете сделать это с помощью специального токена аутентификации (вместо использования службы Firebase Simple Login). https://www.firebase.com/docs/security/custom-login.html –

+0

@ Проверки IP-адреса @AndrewLee могут быть ненадежными. Несколько членов семьи имеют тенденцию использовать один IP-адрес, люди на работе могут также иметь один IP-адрес, а поставщики широкополосных услуг также периодически меняют ваш IP-адрес. –

1

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

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

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

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

3

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

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

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

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

Надеется, что это помогает ..

1

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

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

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

Смежные вопросы