我正在制作一个带有投票系统的网站(使用PHP,JavaScript和MySQL),该系统允许人们匿名投票,但只能投票一次。
这意味着我的系统必须知道谁投票了(因为我必须检查用户是否已经投票),但我不想将用户名或用户的IP地址存储在数据库中(破坏匿名性)。我不知道如何开始,我需要一些指导方针;我应该寻找什么?
你最糟糕的问题是如何确保你的用户只投票一次,但这不是问题的重点:你问的是如何确保匿名性。
这相当简单:将您用于单次投票的任何内容视为密码,并对其进行哈希处理。因此,为了论证起见,让我们说您正在使用IP。我知道这个问题,但让我们假设这是你的选择。
- 用户投票
- 您对 IP 进行哈希处理并保存。
- 您甚至可以将其保存在其他位置。甚至不需要保存哪个哈希投票哪个选项。
- 用户再次投票 -> IP 哈希在数据库中准备就绪。
- 如果有人已经投票,不要放弃,不要回复"你已经投票了",但只是不要保存投票。这样甚至无法知道这台机器是否投票
请注意,这是关于匿名性的,而不是关于如何确保单一投票。
正如Lix所说,在不存储IP地址或强迫用户注册的情况下,唯一的方法是存储链接到会话的Cookie,但这当然绝不是解决方案,因为Cookie可以很容易地清除。
您可以尝试使用持久性 Cookie 解决方案,例如 evercookie,但如果我是实现类似内容的网站的用户,那会比注册更让我烦恼,而且无论使用什么方法,它们总是可以绕过以删除 Cookie/识别信息。
另一种可能性是另一种形式的持久性Cookie,它去年(或者是2012年 - 我忘记了),它利用Flash来存储Cookie。这些 Cookie 可以在多个浏览器中访问。一个这样的解决方案是flash-cookie,但同样,这可能会惹恼用户,并且不是100%可靠,因为并非所有用户都启用了或安装了Flash。