【问题标题】:How to recognize 2 PCs with same IP and browser(version)如何识别具有相同IP和浏览器的2台PC(版本)
【发布时间】:2014-10-15 12:07:30
【问题描述】:

我想在我的页面上为未登录的用户提供“喜欢”选项。

最简单的方法是检测用户 IP(例如通过$_SERVER['REMOTE_ADDR'])。

更复杂的是检测用户的代理(例如通过$_SERVER['HTTP_USER_AGENT'])。

但我想为“家庭中的每台 PC”(real-life 家庭)提供相似的可能性 - 这也可能意味着它们不仅具有相同的 IP,不仅具有相同的浏览器,而且具有相同的浏览器版本...

那么我如何确定它是否是不同的 PC? (使用 cookie/会话)

我想为每台 PC 存储一个“赞”,因为 cookie 可以被清除,所以我不想使用它们 :)

我想从整个问题中抽象出我的特殊兴趣 - 所以我做到了。
然而你应该永远相信用户输入(正如大卫指出的那样) - 所以不要基于你的最后的赞数就在于此! 至少设置一个喜欢/每个 IP 的限制,并将其与 cookie/会话结合起来。

【问题讨论】:

  • 为什么不想使用“cookies/session”?这是实现目标的标准方法。
  • 它们可以被清除...我只想存储一个喜欢/PC
  • 如果你不想使用 cookie,你就不能这样做。除非您的网站有一个单用户登录系统,并且您将所有用户锁定为每人一票,因此如果他们曾经使用过它,他们将无法再次使用它。
  • 没有像这样跟踪“PC”的有效方法。但是,您可以通过身份验证系统来跟踪“用户”。
  • @David 你只是用两句话总结了我的长答案:-)

标签: php browser user-agent detect


【解决方案1】:

除了使用 cookie、登录等的简单方法之外,您唯一的选择是进行浏览器指纹识别。该技术涉及收集浏览器输出到服务器/网页的各种信息,并对其进行哈希处理以创建该客户端的唯一 ID。它具有非常高的准确性,并且在您描述的情况下可以很好地工作。

它基于“没有两个浏览器完全相同”的想法。换句话说,您查看屏幕分辨率、用户代理字符串、活动插件等,并创建这些设置的“指纹”。几乎总是会以某种方式出现差异。

有一些可用的库可以帮助您入门。这是一个很容易实现和理解的...https://github.com/Valve/fingerprintjs

【讨论】:

  • "screen resolution" - 我怀疑这种方法的“非常高的准确性”。似乎用于计算“指纹”的指标越多,任何用户必须更改他们的“指纹”的选项就越多,即使是偶然的。
  • 是的,是的,是的——我的意思是这样的 :) 谢谢 :)
  • @David 评论前请阅读...panopticlick.eff.org/browser-uniqueness.pdf 请记住,人们可以改变事物的想法在现实中并没有发挥作用,但也解释了低于 100% 的准确性。绝大多数人不能也永远不会改变任何事情。指纹识别并不完美,但对大众来说已经足够有效了。
  • 有趣的论文。第 5 节值得一读。 (你知道,之前你评论和所有......)@jave.web:需要考虑的事情取决于你的应用程序的时间指标(未在问题中指定)。如果用户在很长一段时间后又回到同一组“喜欢”的东西,那么其可靠性似乎会急剧下降。如果数据“类似于 Twitter”并且不断变化,很快就会消失,这可能不是问题。如果数据更像“堆栈溢出”并为后代保留,则可能会出现更多问题。
  • @David 非常好 - 将考虑删除时间部分 :) (&& 无论如何都会使用 IP 限制)
【解决方案2】:

您可以在不使用 cookie 的情况下使用会话。当用户登录时,他们会得到一个令牌,这个令牌会附加到他们访问的每个 URL 上。 (在 PHP 中,如果您在浏览器中禁用 cookie,您会看到这一点,您将在 URL 中获得“PHPSESSIONID”)。因此,如果您让用户在投票/喜欢/其他任何事情之前登录,那么您可以使用会话而不是 cookie 来实现这一点。

如果您谈论的是没有登录机制的公共用户,那么实际上没有任何方法可以实现这一点,除非您设置一个 cookie 记录该浏览器已投票的事实。

但是请注意,cookie 不仅可以被删除,而且除非家庭中的每个人都使用不同的浏览器或在他们的操作系统上单独登录,否则它实际上不会达到您想要的效果。否则,据您所知,它们实际上都是同一个用户。人们还可以使用多个浏览器,这样一个人就可以多次投票/点赞。

【讨论】:

    【解决方案3】:

    检测用户代理很容易被欺骗;所以这不是一个可靠的方法。最好的方法是会话或 cookie。为什么不想使用它们?

    【讨论】:

      【解决方案4】:

      简短的回答:你不能。

      请记住,对 Web 服务器的每个请求都是一个新事件。 Cookie 是在调用之间保持数据的唯一方法。因此,如果您将它们排除在外,您真的无法区分它们。这是 Google 在其网站上放置长效 cookie 的主要原因。

      可以删除 cookie 吗?当然。但它们确实是您唯一的选择。

      【讨论】:

      • 那么您是否建议对每个/IP 投票进行全面限制?
      • 没有。最好的解决方案是使用会话登录。每个帐户一票。
      • 这应该是“公开”点赞 - 如果我想为/每个帐户点赞,则无需登录 我根本不会问这个问题 :)
      • 那么这个答案的第一行就是你需要知道的——你不能这样做(没有cookies)。
      • @jave.web:如果该浏览器向您发送此类信息,那当然可以。但无论你怎么看,你都在谈论来自客户端的跟踪信息,而不是来自服务器的信息。来自客户端的任何信息都可能被欺骗/省略/等等。这根本不可靠。 “永远不要相信用户输入”不仅仅是关于 SQL 注入,而是关于来自客户端的所有内容。
      【解决方案5】:

      您不能为 PC 提供单一身份。 可以清除 Cookie。 用户登录可以从不同的计算机完成。

      $ip.$http_user_agent 将不起作用。 用户可以重新启动调制解调器,并且 ISP 可能会分配一个新的 IP。 或使用其他浏览器更改 $http_user_agent。 或者 LAN 上的另一个系统可能具有相同的 $http_user_agent。

      给每台 PC 一个“赞”有什么意义(前提是您甚至能够正确识别 PC)? 如果两个不同口味的用户使用同一台 PC 会怎样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        相关资源
        最近更新 更多