Я заметил, что для голосования SO реализует метод XHR, который отправляет POST в контроллер сообщений и отправляет идентификатор сообщения и тип голосования через URL-адрес, кроме того, отправляется параметр fkey
, например:
http://stackoverflow.com/posts/1/vote/2
Я собираюсь реализовать похожую технику, мне интересно, какую логику я мог бы использовать для предотвращения дублирования голосования одним и тем же пользователем и предотвращения спама в дополнение к общей логике при реализации этого.
Схема таблицы, которую я буду хранить:
thread_id user_id vote_type
2334 1 2
Пока что я придумал следующие пункты:
- убедитесь, что пользователь вошел в систему
- убедитесь, что отправлены действительный идентификатор сообщения и действительный тип голосования
- убедитесь, что после POSTing пользователь ранее не голосовал
- код, который создает хэш, не может содержать динамическую информацию, такую как пользовательский агент, поскольку пользователь может быть в другом браузере, в другой ОС, верно?
Обновление:
«SO, вероятно, использует cookie для входа в систему для идентификации пользователя». - Андрей
Может ли кто-нибудь продемонстрировать, как это будет сделано, или, другими словами, более конкретно предоставить пример того, как создается fkey
, представляющая собой буквенно-цифровую 32-битную строку?
Вопрос:
- поскольку я никуда не отправляю фактический идентификатор пользователя с моим кодом XHR, означает ли это, что мне нужно обновить схему моей таблицы, чтобы я мог хранить
fkey
вместо, скажем,user_id
?fkey
, вероятно, должен быть уникальным для каждого пользователя, и поэтому я, вероятно, могу запросить, есть ли в таблице голосования строка, в которой есть какой-либо fkey.
Буду признателен за любые советы или идеи для любого, кто реализовал подобную технику.