2

我注意到,为了投票,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_id? 可能必须对每个用户都是唯一的fkey,因此我可以查询投票表中是否有一行具有任何 fkey。

将不胜感激任何实施类似技术的人的提示或见解。

4

3 回答 3

2

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

于 2010-01-12T07:20:07.207 回答
1

您可以以某种方式对 URI 进行签名,以防止用户操纵价值。例如,您可以使用秘密散列 URI 的一部分并将散列附加到 URI。当用户复制 URI 并更改值时,URI 和签名部分将失效。

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

于 2010-01-11T22:04:35.023 回答
1

我认为这取决于您希望阻止人们重新提交或摆弄您的数据的程度。没有什么是 100% 的(除非您的预算超出了上限),但您可以通过以下方式很好地防止大多数人重新提交:

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

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

于 2010-01-11T22:19:19.787 回答