我正在开发的一个网站包含一个竞赛,用户可以投票选出他们最喜欢的作品。客户想要某种形式的投票欺诈预防措施。
有人提出了记录所有投票者的 IP 地址的想法,但我不确定这是否是一个好的解决方案。内部 IP 地址当然不是一个好主意,但外部地址呢?我看到的问题是,例如,整个大学计算机实验室可能都使用一个外部 IP 地址运行。——甚至可能是整个校园。如果只允许来自 IP 地址的有限数量的投票,那么完全合法的投票很快就会达到这个限制。
有人知道有更好的方法来实现这个吗?当然以前已经做过了。
任何帮助都值得感激。提前致谢。
答案1
这一切都取决于你想要阻碍用户的程度。
- 您可以使用验证码使自动投票变得不可行,但这并不能阻止单个专门的人进行愚蠢的投票。
- 您可以要求用户在投票之前进行身份验证。
- 您可以要求用户提供电子邮件地址,然后发送一个唯一的一次性链接以提交投票。这类似于您仅在用户拥有有效电子邮件地址时才注册用户的方式。从这里,您可以拒绝对同一电子邮件地址进行多次投票。
- 一旦用户投票,保存一个 cookie 以表明该用户已经投票。这很容易绕过,但可能会阻止技术水平较低的用户。
- 使用 openID(例如通过 dotnetopenauth)向第三方(例如 google 或 yahoo)进行身份验证以访问投票区域,然后记录用户的 openID 以供将来的请求。
- 记录用户的击键次数(键盘动态)、httpcontext数据以及投票完成时间,利用k-means等统计聚类算法统计分析重复投票者的可能性。
- 从现在起事情变得越来越疯狂,所以我将在这里停下来。
答案2
您想要的是仅对已注册至少一周/一个月/等的用户开放投票 - 但这可能对您没有帮助,因为如果您提出 IP 检查,听起来您根本没有对您的用户进行身份验证。
如果您试图消除欺诈行为,但又没有对用户进行身份验证,那么您可能会放弃并走开。如果您对偶然欺诈行为的最低限度减少感到满意,那么您可以采取一些措施。
如果您没有其他选择,选民 IP 检查是一种相对低成本的机制,可以尝试减少多次投票,但正如您所注意到的,它可能会导致合法用户无法投票,并且无法通过招募非用户来防止投票堆积,每个非用户的 IP 地址都是不同的(例如“嘿 Slashdot/Reddit/Pharyngula/IRC-Channel-X,大家去投票支持这个选项吧!”)。单用户填充仍然可以通过僵尸网络或大型代理列表或多台机器上的帐户(即任何不在 NAT 后面的大学实验室)来完成。
您要寻找的是一些用户独有的信息。如果您目前没有这些信息,您可以通过向用户发送一次性令牌来创建它,这基本上是一种邀请投票的方式。当然,如果您的用户尚未授予您向他们发送电子邮件的权限,或者您不知道您的用户是谁,这仍然是有问题的。
如果您可以吸引用户在网站上注册,那么您可以通过这种方式验证投票,但在投票的同时开始这项工作是危险的,因为您再次面临招募活动的可能性。
您可以在民意调查中提出一些问题,任何真正的用户都应该能够轻松回答,但非用户却无法回答,然后通过这种方式过滤结果,但您可能会发现您的用户知道的比您想象的要少,并且没有什么可以阻止向虚假投票者提供包含所有答案的备忘单。
您似乎正在寻找一种方法,将输入限制在未知数量的完全陌生的人,并阻止他们多次输入或更改其表面身份。这不会发生。
答案3
除了限制每个 IP 的数量外,如果您真的关心这些投票是否唯一,您能做的就不多了。您可能希望将投票的 IP 存储在非关系数据库中,以提高查询速度并减少资源使用。