Лучший способ реализовать upvotes/downvotes на веб-сайте?

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

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

Сайт также будет создан с использованием Django и MySQL, что приведет меня к моему второму вопросу:

Как хранить голоса в базе данных MySQL?. Должен ли я хранить целое число в поле в каждом столбце или он должен быть таблицей с одним голосом за строку? Мое предположение, безусловно, первое, но я никогда раньше не работал с чем-то подобным, поэтому я просто хочу убедиться.

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

Ответ 1

С большим трудом.

Причина, по которой большинство других сайтов, которые используют учетные записи upvote/downvote-ing, объясняются тем, что нет другого способа гарантировать, что пользователь не сможет дважды проголосовать за одно и то же.

Доступная вам информация, которая должна "сузить" область действия этого пользователя:

  • Их IP-адрес
  • Их строка UA (может использоваться для дальнейшего сужения поля после первого)
  • Любые файлы cookie/сеансовые данные, которые вы сохранили в своем браузере

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

Если вы просто хотите защитить себя от голосования законных пользователей дважды, просто используйте IP-адреса - они достаточно устойчивы, чтобы обычные пользователи не могли голосовать дважды за короткий промежуток времени.

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

Ответ 2

Я бы очень рекомендовал использовать учетные записи пользователей, чтобы свести к минимуму проблемы. Использование IPAddress - непростая задача. Возьмем простой пример, некоторые компании предоставляют только один IPAddress для внешнего мира. В этом случае ваше сообщество не будет иметь надлежащего распределения, и люди могут подвергнуть сомнению вашу систему голосования. Но если вы решили пойти с системой учетной записи пользователя, вы можете выполнить следующее:

post_table
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| postId     | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| userId     | int(10) unsigned | NO   | MUL | NULL    |                | 
| postTime   | bigint(20)       | NO   |     | NULL    |                | 
| post       | text             | NO   |     | NULL    |                | 
| upVote     | int(11)          | YES  |     | 0       |                | 
| downVote   | int(11)          | YES  |     | 0       |                | 
+------------+------------------+------+-----+---------+----------------+

user_of_website
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| userId       | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| userName     | varchar(50)      | NO   |     | NULL    |                | 
| numPosts     | int(10) unsigned | NO   |     | 0       |                | 
| postsCount   | int(11)          | NO   |     | 0       |                | 
+--------------+------------------+------+-----+---------+----------------+

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

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

Ответ 3

Храните таблицу голосов:

id | post_id | vote_value (+/-1) | ip

Проверяйте это при публикации, чтобы проверить, что этот ip еще не опубликовал этот вопрос. Не идеально, но довольно хорошо.

Составьте эту таблицу в столбце vote_value для заданного post_id, чтобы найти голоса за сообщение.

Ответ 4

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

Посмотрите на отслеживание IP-адресов с помощью PHP и сохраните их в БД. http://php.net/manual/en/function.getenv.php

Ответ 5

Старый вопрос, но я сделаю снимок.

В конечном счете, любая система, пытающаяся получить какой-либо уровень легитимности голосования против злонамеренных пользователей, должна будет использовать CAPTCHA (или некоторый эквивалент предотвращения ботов), но фактическое создание учетной записи не требуется. Как только пользователь проверит свою человечность через CAPTCHA, сохраните на своем компьютере файл cookie, который кодирует его данные IP-адреса. Пока пользователь поддерживает этот файл cookie, он может голосовать с ним как ключ, и вы можете использовать ключ (IP-адрес) в качестве идентификатора. Если файл cookie каким-то образом удален, вы просто повторно аутентифицируете его через CAPTCHA и вернете свой IP-адрес.

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