Asp.net mvc 在图片评级web应用程序中限制来自同一个人的多个投票

Asp.net mvc 在图片评级web应用程序中限制来自同一个人的多个投票,asp.net-mvc,security,voting,Asp.net Mvc,Security,Voting,我正在尝试用ASP.NETMVC编写一个web应用程序,允许每个用户为多张图片投票,但不允许他们为同一张图片投票多次。用户未经过身份验证。我应该在数据库或Cookie中保存什么?将投票存储在数据库表中,其中包含列PictureId、UserId、Score,并在PictureId和UserId列中添加一个复合唯一性约束-这将确保每个用户和图片只有一次投票。如Daniel Brückner所建议的,唯一、经过身份验证的用户的数据库记录必须是前进的方向。Cookie是不可靠的,例如,它们可能会被删除

我正在尝试用ASP.NETMVC编写一个web应用程序,允许每个用户为多张图片投票,但不允许他们为同一张图片投票多次。用户未经过身份验证。我应该在数据库或Cookie中保存什么?

将投票存储在数据库表中,其中包含列
PictureId
UserId
Score
,并在
PictureId
UserId
列中添加一个复合唯一性约束-这将确保每个用户和图片只有一次投票。

如Daniel Brückner所建议的,唯一、经过身份验证的用户的数据库记录必须是前进的方向。Cookie是不可靠的,例如,它们可能会被删除,或者用户可能会使用其他浏览器。

如果您的用户经过身份验证,则您可以使用图像投票保存用户ID


如果您的用户是匿名的,那么系统倾向于使用图像投票存储他们的IP地址。它不是完美的,也不是100%的证明,但它在大多数情况下都有效。

对于匿名用户,您有两种选择,但这两种选择都不是很好:

1) 使用存储在cookie中的用户id跟踪用户。只要cookie持续存在。用户不能投票两次。但是,他们可以删除或修改cookie。他们可能把饼干关掉了。他们可以同时打开两个不同的浏览器。“作弊”(curl)脚本无论如何都不会存储cookie。基本上,你最终会看到人们投了比他们应该投的更多的票

1.5*

2) 按IP地址跟踪用户。这基本上是相反的。无论删除cookie、切换浏览器等,用户都不能投票两次。但是,来自同一家庭的几个人(使用DSL路由器)只能投票一次。许多公司同样会将许多用户隐藏在一个IP地址后面。我想有些ISP也是(AOL?)。你最终得到的“选票”将远远少于合法记录的数量

所以问题是你想要过多还是过少的选票?如果你认为有可能作弊,我会选择2。但如果作弊是可能的,那就意味着有动机。如果人们意识到他们的选票没有被统计(他们可能没有意识到),他们就会不高兴

之后,您是将每个投票存储为一行,还是将投票合并为一行(更新图片集num_voces=num_voces+1,total_score=total_score+[submitted score])取决于您

  • 1.5第三种选择是记录他们的投票和电子邮件地址,向他们发送带有确认链接的电子邮件,并要求他们单击该电子邮件记录他们的投票。人们仍然可以用假电子邮件地址作弊,但这不像删除cookie那么可能

如果每个用户只能为一张图片投票一次,为什么要存储分数?我同意PictureId和UserId的一个表具有复合唯一约束,但是您需要对PictureId运行计数查询,以获得该图片的总投票数(即“分数”)。我还考虑了评级,而不仅仅是投票。也许投票可以从零到五星或者类似的。