Php 建立安全的投票系统

Php 建立安全的投票系统,php,validation,Php,Validation,我目前负责建立一个投票系统(使用PHP) 现在为了尽可能的安全和客观,重要的是访客只能投票一次。我正在考虑通过访问者的IP验证投票(一个IP只能有一张投票),并且可能会加入验证码测试,以确保一旦机器人出于某种原因通过IP验证,就不会有机器人进入 这就是唯一的IP验证和验证码。但这足够了吗?一个用户是否有可能通过使用代理或其他我不知道的方式更改他/她的IP,并使用唯一的IP进行多次投票 有更好的方法吗?最好没有验证码 提前感谢。不要采用唯一Ip的方式。在很多情况下,很多用户拥有相同的ip(即意大利

我目前负责建立一个投票系统(使用PHP)

现在为了尽可能的安全和客观,重要的是访客只能投票一次。我正在考虑通过访问者的IP验证投票(一个IP只能有一张投票),并且可能会加入验证码测试,以确保一旦机器人出于某种原因通过IP验证,就不会有机器人进入

  • 这就是唯一的IP验证和验证码。但这足够了吗?一个用户是否有可能通过使用代理或其他我不知道的方式更改他/她的IP,并使用唯一的IP进行多次投票

  • 有更好的方法吗?最好没有验证码


  • 提前感谢。

    不要采用唯一Ip的方式。在很多情况下,很多用户拥有相同的ip(即意大利isp fastweb、大公司等)。而且,若用户有动态ip,它可以随时更改自己的ip地址


    最好的方法之一应该是使用电子邮件地址和cookie。用户可以多次投票(您无法避免),但至少每次投票都需要一些时间

    防止多重投票没有简单易行的方法。检查cookie是另一个选项


    关于ip地址中的验证。如果用户来自一个被许多用户使用的网络,该怎么办?

    对于一个类似的项目,我做了两次验证。。。 我放置了一个cookie,并在服务器上保存了来自用户ip+用户代理的哈希。
    这似乎非常有效,因为即使有更多的人使用相同的IP,用户代理的哈希值在大多数情况下也会不同,因为同一浏览器的哈希值根据安装的操作系统和其他扩展而不同。

    您无法创建100%安全的投票系统

    • 如果基于注册/IP/cookie,用户可以创建新用户/获取另一台电脑/删除所有cookie
    但您可以尝试使用自动预筛选+管理员作为后筛选工作流:

    • 使用cookie(或IP/浏览器属性等)自动过滤防止多重投票
    • 在管理员视图中,管理员可以根据IP或子网地址手动解析和删除投票。这也不是一个完美的解决方案,但通过一些良好的查询(来自同一IP/子网的同一时间间隔内的相同投票),管理员可以轻松删除可疑投票

    此解决方案的一大缺点是需要管理员。但是-我认为-没有完美的解决方案。

    除非您需要身份验证,否则您无法确定每个人只投票一次。当然,这完全是矫枉过正,所以真正的问题是:如何让多张选票更加困难

    • 带有验证码的电子邮件。我不知道有多过分,但这取决于你有多确定
    • 使用会话检查投票人。显然不是100%安全,但会阻止99%的ppl
    • 使用cookie检查投票人。如上所述,一些ppl将知道如何删除Cookie
    • 使用POST,忽略GET
    • 使用上述两种或三种方法的组合

    如果要使用IP进行验证,请不要仅使用远程地址,而要将整个IP与X-Forwarded-for结合使用。这样你就不会阻止人们通过同一个代理进行连接。

    在公共投票系统中,如果用户不需要登录,则绝对无法确定用户是否投票过一次

    检查IP不是一个好主意,原因有几个。如其他答案所述,一个ip后面有很多网络,用户可以使用另一台ip不同的pc再次投票

    OpenId

    使用OpenId识别用户并检查他们是否已经投票

    注册用户

    或者,如果用户没有openid帐户,您可以允许他们自己注册


    要实现一个安全的系统,会话欺骗和多次投票是很困难的

    好的一点!我也知道大多数普通用户不这样做,但同一台机器上的多个浏览器在他们自己的会话中运行,但具有相同的IP地址,但这意味着同一用户可以通过清除Cookie并提供不同的电子邮件地址来再次投票?是的,但无论如何都无法避免多次投票。在这种模式下,注册新的电子邮件地址需要一些时间,因此它将阻止大规模投票(在电子邮件地址中,您应该发送一个带有投票激活码的链接,因此它必须是有效的)。我在一个网站上这样做过一次,并且它会被各种临时收件箱服务中的临时电子邮件地址垃圾邮件发送(OpenID是一个坏主意,因为有些提供商不需要注册就可以拥有无限个帐户(你只需要选择一些东西-provider.com/任何东西都可以)。如果你自己管理用户,他们也可以用不同的别名创建多个帐户。这只是防止了大规模利用。