独特的用户投票策略,如Stackoverflow?

时间:2010-01-11 21:59:39

标签: php zend-framework spam-prevention voting

我注意到,对于投票,SO实现了一个XHR方法,该方法POST到帖子控制器并通过URL发送帖子ID和投票类型,另外发送fkey参数,例如:

http://stackoverflow.com/posts/1/vote/2

我将要实现类似的技术,我想知道我可以使用什么逻辑来防止同一用户进行重复投票并防止发送垃圾邮件,以及实现此时的整体逻辑。

我将存储它们的表的架构:

thread_id   user_id   vote_type
2334        1         2

到目前为止,我想出了这些要点:

  • 确保用户已登录
  • 确保发送有效的帖子ID和有效的投票类型
  • 确保在POST后,用户之前没有投票
  • 创建哈希的代码不能包含用户代理等动态信息,因为用户可能在不同的浏览器上,不同的操作系统,对吗?

更新

“SO可能正在使用登录cookie来识别用户。” - 安德鲁

有人可以演示如何做到这一点,换句话说,更具体地提供一个如何生成fkey(一个字母数字32位字符串)的例子吗?

问题:

  • 因为我没有使用我的XHR代码在任何地方发送实际用户ID,这是否意味着我必须更新我的表架构,以便我可以存储fkey而不是user_idfkey可能必须对每个用户都是唯一的,因此我可以查询投票表中是否有一行有fkey的行。

非常感谢有关实施类似技术的人的任何提示或见解。

3 个答案:

答案 0 :(得分:2)

在字段上创建UNIQUE索引(thread_id,user_id),DBengine将保护您免受一个线程上的多条注释:)

答案 1 :(得分:1)

您可以以某种方式签署URI,以防止用户操纵valuse。例如,您可以使用机密散列部分URI,并将散列附加到URI。当用户复制URI并更改值时,URI和签名部分将变为无效。

这通常在RESTful API中完成,您当前的方法类似于。

答案 2 :(得分:1)

我认为这取决于您希望让人们重新提交或摆弄您的数据的严重程度。没有什么是100%(除非你的预算是通过屋顶),但你可以做得很好,以防止大多数人重新提交:

  • 检查他们的UID - 或从UID生成ID(我会解释)
  • 记录他们的IP地址,并检查数据库中的IP和提交ID(以及生成的UID)

单独使用IP解决方案,当然可以使用代理,或者经常更改IP的连接,例如我所在城市的DSL运营商(但即便如此,它每隔几天)也会失败。我个人基于那些人UID生成一个唯一的密钥,并在必要时将其传递回第四个密钥。如果MD5被视为太弱,则盐渍MD5哈希通常可以正常工作,甚至是AES实现。结合在一起,你应该有一个良好的起点。