我正在尝试在ASP.NET MVC中编写一个Web应用程序,它允许每个用户投票支持多张图片但不允许他们多次为同一张图片投票。用户未经过身份验证。我应该在数据库或cookie中保存什么?
答案 0 :(得分:6)
将投票存储在包含PictureId
,UserId
,Score
列的数据库表格中,并为列PictureId
和UserId
添加复合唯一约束 - 这将确保每个用户和图片只有一个投票。
答案 1 :(得分:3)
对于匿名用户,您有两种选择,两者都不是很好:
1)使用存储在cookie中的用户ID跟踪用户。只要cookie仍然存在。用户不能投票两次。但是,他们可以删除或以其他方式修改cookie。他们可能关闭了cookie。他们可以同时打开两个不同的浏览器。 “作弊”(curl http://site/vote?score=5&pic_id=1)的脚本无论如何都不会存储cookie。基本上,你最终会有人投票超过他们应该的投票。
1.5 *
2)通过IP地址跟踪用户。这基本上是相反的。无论删除cookie,切换浏览器等,用户都不能投票两次。但是,来自同一家庭的几个人(使用DSL路由器)只能投票一次。许多公司同样会将许多用户隐藏在单个IP地址之后。我认为一些互联网服务供应商也这样做(美国在线?)。你最终会得到比合法应该记录的“投票”少得多的“投票”。
所以问题是你想要超过还是低于选票?如果你认为有可能作弊,我会选择#2。但如果可能作弊,那就意味着有一种激励。如果人们意识到他们的选票不计算(他们可能没有意识到),他们就会不高兴。
之后,您是将每个投票存储为一行,还是将投票合并为一行(更新图片集num_votes = num_votes + 1,total_score = total_score + [提交的分数])取决于您。
答案 2 :(得分:1)
DanielBrückner建议,独特的,经过身份验证的用户的数据库记录必须是前进的方向。 Cookie不可靠,例如,可以删除它们或用户可以使用其他浏览器。
答案 3 :(得分:0)
如果您的用户已通过身份验证,则可以使用图像投票保存UserID。
如果您的用户是匿名用户,那么系统会倾向于使用Image投票存储他们的IP地址。它并不完美,它不是100%证明,但它适用于大多数情况。