首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >投票-停止来自客户端的滥用- ASP.NET MVC

投票-停止来自客户端的滥用- ASP.NET MVC
EN

Stack Overflow用户
提问于 2010-02-14 15:15:28
回答 4查看 3.9K关注 0票数 3

所以我设计了这个投票的东西,它不允许一个人在24小时内为同一篇文章投票两次。但是,假设一个人投票,并且在看到这个人能够投票或者他在24小时窗口中倒下之后,我禁用了投票按钮(这都是Ajax btw)。

但是,当一个人关闭他/她的浏览器并重新启动甚至刷新页面时,该怎么办呢?显然,由于我的算法,他不能投票,但这个人仍然可以成功地调用服务器。因此,如果他真的想要,他会不断刷新页面和点击投票,并在服务器上施加不必要的负载。如何通过做一些客户端的事情或其他事情来避免这种情况?

我使用的是ASP.NET MVC,所以会话变量是不成问题的。

我是不是对此过于担心了?

EN

回答 4

Stack Overflow用户

发布于 2010-02-15 06:15:59

如果投票只发生在登录(已知)的成员,那么你应该没有任何问题。

另一方面,如果每个人都可以投票,那么您需要存储所有用户投票事件:

  • timestamp
  • poll
  • poll_vote
  • ip
  • user agent
  • 用户唯一性cookie

所以你需要一个随机的散列作为cookie发送出去。这将确保您不会接受同一人对同一投票的另一次投票。

如果用户删除了他的cookie,您将退回到B计划,在该计划中,您在24小时内不允许来自同一IP和用户代理组合的投票超过(比方说) 10票。

这个系统并不完美,因为用户可以更换is和(更容易)用户代理。你需要先进的模式检测算法来检测可疑投票。存储所有用户投票事件的好处是,您可以稍后使用调度程序处理这些事件,或者将投票外包给其他可以为您处理它们的人。

祝好运

票数 5
EN

Stack Overflow用户

发布于 2010-02-15 06:08:57

刷新不是问题

  1. 如果您使用Ajax执行所有这些投票,则刷新页面只会使用GET加载页面。
  2. 如果您不使用Ajax,则应确保调用RedirectToAction/RedirectToRoute操作结果,这将帮助您避免刷新问题。

您如何识别用户

如果您使用某种类型的用户身份验证,则重新投票不是问题。但是如果你的用户是普通的匿名用户,你应该把IP地址和你的选票一起存储起来。这就是通常做事情的方式。这也使得避免会话变量成为可能。但你必须意识到这项技术,因为它不是100%完美的。

曲奇饼?

当然,您也可以使用绝对过期的cookie。它们会在一天内过期。高级用户当然可以避免您的投票限制,但他们也可以避免其他方式。会话BTW也是基于cookie的。

组合

但是当你想让你的系统尽可能好的时候,你可能会使用以上几种方法的组合。

票数 1
EN

Stack Overflow用户

发布于 2010-02-14 15:39:48

最好的方法是跟踪谁在服务器上投了什么票以及什么时候投的票(可能将其存储在数据库中)。为此,您必须在站点上使用身份验证系统(可能是forms authentication)来识别用户。因此,每当有人试图投票时,你首先检查数据存储中他是否已经投票,以及何时投票,并决定是否验证投票。这是最可靠的方法。

如果您的站点是匿名的(投票不需要身份验证),那么您可以在客户端计算机上存储一个持久cookie,该cookie将持续24小时,并表明已经从该计算机进行了投票。但请记住,cookies可能会被禁用、删除,并且不是识别给定用户的可靠方法。

我使用的是ASP.NET MVC,所以会话变量是没有问题的。

有什么原因吗?在ASP.NET MVC应用程序中,会话是非常好的。在您的情况下,它们不会工作,因为如果用户关闭浏览器,他将失去会话。

很明显,由于我的算法,他不能投票,但是这个人仍然可以成功地调用服务器。

,the,the,成功地调用服务器。因此,如果他真的想要,他会不断刷新页面和点击投票,并在服务器上增加不必要的负载

自动化机器人也会给你的服务器带来不必要的负载,这比单个用户点击F5要重要得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2260406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档