我注意到,对于投票,SO实现了一个XHR方法,该方法POST到帖子控制器并通过URL发送帖子ID和投票类型,另外发送fkey
参数,例如:
http://stackoverflow.com/posts/1/vote/2
我将要实现类似的技术,我想知道我可以使用什么逻辑来防止同一用户进行重复投票并防止发送垃圾邮件,以及实现此时的整体逻辑。
我将存储它们的表的架构:
thread_id user_id vote_type
2334 1 2
到目前为止,我想出了这些要点:
更新
“SO可能正在使用登录cookie来识别用户。” - 安德鲁
有人可以演示如何做到这一点,换句话说,更具体地提供一个如何生成fkey
(一个字母数字32位字符串)的例子吗?
问题:
fkey
而不是user_id
? fkey
可能必须对每个用户都是唯一的,因此我可以查询投票表中是否有一行有fkey的行。非常感谢有关实施类似技术的人的任何提示或见解。
答案 0 :(得分:2)
在字段上创建UNIQUE索引(thread_id,user_id),DBengine将保护您免受一个线程上的多条注释:)
答案 1 :(得分:1)
您可以以某种方式签署URI,以防止用户操纵valuse。例如,您可以使用机密散列部分URI,并将散列附加到URI。当用户复制URI并更改值时,URI和签名部分将变为无效。
这通常在RESTful API中完成,您当前的方法类似于。
答案 2 :(得分:1)
我认为这取决于您希望让人们重新提交或摆弄您的数据的严重程度。没有什么是100%(除非你的预算是通过屋顶),但你可以做得很好,以防止大多数人重新提交:
单独使用IP解决方案,当然可以使用代理,或者经常更改IP的连接,例如我所在城市的DSL运营商(但即便如此,它每隔几天)也会失败。我个人基于那些人UID生成一个唯一的密钥,并在必要时将其传递回第四个密钥。如果MD5被视为太弱,则盐渍MD5哈希通常可以正常工作,甚至是AES实现。结合在一起,你应该有一个良好的起点。