使用PHP实现无需登录的安全投票系统

5
有没有一种方法可以使投票系统相对安全,而不需要登录。我现在使用cookie来设置该用户是否已经投票,并将用户的IP地址插入到数据库中。
如果该用户删除了他的cookie,他将能够再次投票。这就是为什么我要检查用户的IP地址是否存在于数据库中,并且该IP地址是否在最近30秒内投过票。这样,他必须删除他的cookie并更改他的IP地址才能再次投票。
我知道没有100%完美可靠的解决方案,但是否有更安全的方法来解决这个问题?

1
没有登录,是的,在我看来这是最好的方式。 - fire
1
你可以在这个问题中找到一些有用的信息,但看起来你已经尽可能地保证了安全性。 - jeffjenx
这个问题中有一些好的想法和策略 https://dev59.com/iEjSa4cB1Zd3GeqPDCcV。Google如何防止点击欺诈(对于他们的广告,但同样适用于投票)https://dev59.com/s3A65IYBdhLWcg3w4C6j - Mike B
@MrSlayer 我看了你发的链接,从中我想到了一种更加安全的方法来保护我的程序。我可以将用户代理、Flash 版本等信息与 IP 地址一起存储在数据库中,并检查这些变量。如果它们全部匹配,那么这个人就不能再次投票了。 - Steven Dobbelaere
3个回答

4

有两种方式可以改善您的结果,但请自行阅读并判断是否需要:

更持久的Cookie

Evercookie项目,它将类似于Cookie的信息存储在许多地方。相比普通的Cookie,它要难以删除得多。

我个人认为,这个项目应该被视为一个概念验证,实际使用它是不道德的。

更好的用户识别

不仅仅检查IP地址来识别回访者,您还可以使用浏览器指纹识别。EFF通过他们的Panopticlick项目展示了浏览器版本、操作系统版本、安装的插件等组合常常是独特的。Piwik网络分析工具也使用这种类型的用户启发式来区分访问者。我不知道实现方式,但它是FOSS和PHP编写的,所以您应该能够找到那部分。


1

你可以将这两个解决方案同时运行,但是它仍然不太安全。你可以阻止子网进行投票(192.168.1.xxx),以防止动态IP更改,但是这样也会阻止高达254人进行投票,并且无法防止代理。

我见过的一种方法是让它看起来好像允许重复投票;即:在最终用户端显示他们的重复投票已被计入,但实际上并没有在你自己的数据库中计数。

但实际上,登录系统是相对“安全”进行此操作的唯一方式 - 但如果有人有足够的决心,那也肯定可以操纵它。

希望这有所帮助。

  • Eoghan

真的。我限制某个IP在有限的时间内投票的原因是因为我不想限制其他使用相同IP的用户投票。我不介意用户在一定时间后能够再次投票,但我只是不想最终得到一个由同一人投出数百张选票的数据库。 - Steven Dobbelaere

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接