需要进行在线投票。为了避免重复投票,除了在客户端做一些检查,我在服务器端固定了用户的IP和投票id。相应地,如果给定IP的用户已经用给定的id参与了投票,则不接受他在本次投票中的更多票数。但另一方面,毕竟一堆人坐拥1个外部IP的情况,据我了解,在供应商中是相当普遍的,尤其是在大城市,事实证明,他们中的1人投票,他的邻居坐在同一个外部 IP 上,他们将无法投票(如果他们突然闯入)。问题是 - 上述 IP 检查是否过于严格,后端的替代方案是什么?
也许这些动作的实际意义比较弱,因为有一定的概率不计票,但可以忽略不计,理论上这种情况让我很烦,如果去掉这样的IP检查,结果是有人可以在浏览器中进入 javascript 并发送 100,500,000 个请求,从而严重扭曲投票结果。这是两害相权取其轻的选择。最后,做某事如何更好:敞开大门,希望一切都好,还是尽可能多地投保?也许我错过了什么。
没有办法保护互联网上的投票,仅通过检查发给公民的唯一文件或州内唯一的帐户来保护投票也不错。只能通过这个文件来确认的服务,虽然要知道文件可以被伪造或被盗,你的用户的声音可以在任务交易所购买,但这一切都取决于攻击者追求的目标和范围。
我要引出的问题是,如果投票只是出于获取统计数据的需要,那么你的问题的主要内容是分析和理解提出一些想法是否有意义。
请记住,保护的代价永远不应超过作弊者从这次胜利中获得的收益。
解决方案
1) 最简单的解决方案是在注册用户中进行在线调查,并限制某些内部参数,例如注册日期或总体评分。例如在stackoverflow上,评分较低的用户有较少的选择。这是正确实现的,因为如果您需要在使用类似算法的网站上作弊,那么这种作弊的价格可能会超过您可以获得的平均奖金,而且没有人会简单地这样做。奖品我指的是任何东西(有形的,无形的)
2) @VladD 概述了一个有趣的想法,通过浏览器指纹识别,这可以使用 FingerprintJS 库,检测百分比:90% - 这允许您通过计算硬件和软件参数、设置值来确定您是否成功在各种本地存储中。
3)用户通过关闭Javascript等方式轻松绕过该方法。从而降低指纹的唯一性,但这可以通过添加 Google ReCaptcha 轻松绕过,这将避免自动投票。
4) 发送短信和注册电话号码——这很昂贵,而且并不总是有效。
5) 如果用户在您的服务中没有帐户,则让他使用另一个受信任的服务(不是社交网络!)进行投票,如果可能,请求提供有关此服务注册日期的数据以及其他有助于识别的信息他。
附加措施
1) 不显示票数——这会让攻击者不知道当前情况,普通用户在执行过程中不需要知道票数。
2) 可以替换答案选项或将它们混合在一起,这会使负责为选项 4 投票的人感到困惑 :)
3)投票可以有选择地(分批次)展示,全靠你的想象力。
使用所有东西的一点点,并获得或多或少正确的算法来确定结果。
票数不是主要的,质量才是最重要的。
最简单的是使用客户端 cookie。创建一个带有 ID 的 cookie,并将 ID 保存到数据库中。