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

На этот вопрос уже есть ответ здесь:

Уникальные IP-адреса в системе голосования 7 ответов

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

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

Вопросы:

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

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

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

низкие награды $ 100 / месяц отдано.войти в isn 'На самом деле я хочу, чтобы пользователи были зарегистрированы и проверены человеческими глазами, чтобы иметь право голосовать. Другие могут стать свидетелями конкурса, но не могут голосовать.серверные проверки. Если мое приложение набирает популярность, я могу написать сценарии для мониторинга шаблонов голосования на предмет нарушений? если кто-то злоупотребляет системой, я отключаю его способность побеждать.
 mawburn31 мая 2013 г., 20:07
"денежное вознаграждение " вещь может быть плохой идеей. Вы'никогда, повторяюникогдабудет возможность помешать людям выходить и покупать кучу прокси и VPN для голосования.
 andre31 мая 2013 г., 20:07
Это кажется ошибочным с самого начала. Безопасность не может быть гарантирована на стороне клиента.
 Sethen31 мая 2013 г., 20:08
Как говорили другие, полагаться исключительно на JS - это путь к катастрофе. Вы'нам нужно будет включить некоторые вещи на стороне сервера.
 Sethen31 мая 2013 г., 20:09
Кроме того, вам нужно подумать о том, что произойдет, если пользователь неJS вообще не включен ... Тогда что?
 Jimbo31 мая 2013 г., 22:08
У вас есть пара вопросов очто?

Ответы на вопрос(4)

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

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

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

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

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

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

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

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

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

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

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

Решение Вопроса

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

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

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

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

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

 Front_End_Dev31 мая 2013 г., 22:13
Мне нравится это, яЯ собираюсь посмотреть, что он может сделать сегодня вечером!
 Andrew Lee01 июн. 2013 г., 21:07
Если вы хотите иметь дополнительный уровень безопасности, такой как проверка IP-адреса, чтобы помочь людям не создавать дубликаты учетных записей, вы можете сделать это с помощью специального токена авторизации (вместо использования службы простого входа Firebase).firebase.com/docs/security/custom-login.html
 Mike Pugh02 июн. 2013 г., 20:48
@ AndrewLee проверка IP-адреса может быть ненадежной. Несколько членов домохозяйства, как правило, используют один и тот же IP-адрес, люди на работе могут также использовать один и тот же IP-адрес, а поставщики услуг широкополосного доступа также периодически меняют ваш IP-адрес.
 Jake17 апр. 2014 г., 18:04
Просто небольшое (возможно) примечание: вы, вероятно, также хотите добавить в ".записывать" правило, что только пользователь, который голосует, может добавить в список $ articleid. Что-то вроде "! data.exists () && auth.uid === $ userid "

Ваш ответ на вопрос