PHP/Javascript:区分同一网络中的两台计算机

PHP/Javascript:区分同一网络中的两台计算机,php,javascript,networking,local,Php,Javascript,Networking,Local,我正在开发一个网站,不允许您在一台计算机上登录多个帐户,但我不知道如何做到这一点。方法必须是: 跨平台(可在Windows/Mac/Linux客户端上使用) 浏览器无关 这是为了避免一些用户利用多个用户获得不公平的优势,同时仍然允许本地网络上的两个人连接,只要他们在不同的计算机上 有什么提示吗?你可以尝试使用持久性Cookie,比如“Evercookie”,这样你就可以用一个独特的Cookie来识别每台计算机,并且它是持久的 然后,您需要做的就是将cookie链接到会话处理模式 编辑: 正如

我正在开发一个网站,不允许您在一台计算机上登录多个帐户,但我不知道如何做到这一点。方法必须是:

  • 跨平台(可在Windows/Mac/Linux客户端上使用)
  • 浏览器无关
这是为了避免一些用户利用多个用户获得不公平的优势,同时仍然允许本地网络上的两个人连接,只要他们在不同的计算机上


有什么提示吗?

你可以尝试使用持久性Cookie,比如“Evercookie”,这样你就可以用一个独特的Cookie来识别每台计算机,并且它是持久的

然后,您需要做的就是将cookie链接到会话处理模式

编辑: 正如Claudiu指出的,您还需要检查用户是否启用了JS,并在禁用JS的情况下拒绝访问

所有使用IP地址进行验证的方法都有两个问题: -任何人都可以使用代理并绕过它们
-它无法在自然环境下工作

我看到的唯一方法是通过IP进行检查,如果您已经连接了$\u服务器['REMOTE\u ADDR',],那么不要让任何其他服务器连接。当然,在某些情况下,您可以在两台不同的PC上拥有相同的IP,但这是最安全的方式,因此您的用户应该知道这一点

有几个因素需要考虑

确保每个ip地址只有一个会话是最好的方法,唯一的缺点是如果用户不注销,您可能会遇到问题

我要做的是

将登录的用户存储在一个表中并跟踪上一个活动,如果您的站点是一个用户在一段时间内可能不会更改页面的站点,那么您应该设置一个javascript心跳信号,从浏览器ping您的服务器,以便PHP始终是最新的

如果用户A已登录,并且来自不同IP的另一次尝试尝试登录,则应停用用户A的登录状态,并允许用户B启动新会话

您还应该跟踪用户用于登录的IP地址,这样就可以有一个递增的表,如

user_id         ip                hits
--------------------------------------
1             xxx.yyy.zzz.244     6
1             xxx.yyy.zzz.224     4
1             xxx.yyy.zzz.264     1
1             xxx.yyy.zzz.124     1
1             xxx.yyy.zzz.174     1
2             aaa.bbb.zzz.678     3
.....

通过这种方式,如果用户a登录并且用户B尝试,您可以运行一个检查,看看这个IP以前是否使用过,如果使用过,那么您只需直接注销,否则您可以在注册时询问一个秘密问题,以帮助解决安全方面的问题在数据库中显示某人当前是否登录

不起作用的事情以及原因:

  • IP:路由器后面的本地LAN中的每个人在您的网站上都会显示为具有相同的IP地址

  • Cookies:它们依赖于浏览器。例如IE中的cookie在Firefox中是未知的


  • 唯一的方法是通过客户端的IP地址进行区分,正如其他人在这里提到的,但是,如果您的用户要使用代理,事情会变得更加棘手

    代理之间有一个事实上的标准,即添加一个名为“X-Forwarded-For”的HTTP头,该头反映了客户端的内部IP。原则上,$\u SERVER['REMOTE\u ADDR']加上X-Forwarded-For的值可以为您提供客户端机器的唯一标识。但是,使用真实IP地址的高级攻击者很容易伪造X-Forwarded-For

    要在php中获取X-Forwarded-For的值,请执行以下操作:

    $headers = apache_request_headers(); 
    $full_client_id = $_SERVER['REMOTE_ADDR'] . '|' . $headers["X-Forwarded-For"];
    
    $full_client_id,可能看起来像“123.1.2.3 | 192.168.1.1”,将为您提供存储在会话数据中的几乎可靠的标识,并与每个新创建的会话进行比较


    <>这将保护你至少对非高级用户非常明显的误用。

    < P>编辑:我认为我的答案是一个黑客,并希望看到一个最佳实践选择。

    虽然我很讨厌他们,但在这里检查一下也行。大多数用户甚至不知道他们在计算机上,所以你不必担心他们被删除。转到此链接,查看有多少人在您不知情的情况下长期坐在您的计算机上:

    我不认为Flash和iPhone配合使用,但你没有提到


    以下是adobe对flash的看法。还具有闪存渗透功能。

    会话ID应该能够很容易地将它们区分开来

    试试这个:

    <?php
    $a = session_id();
    if(empty($a)) session_start();
    echo "SID: ".SID."<br>session_id(): ".session_id()."<br>COOKIE: ".$_COOKIE["PHPSESSID"];
    ?>
    
    
    

    显示身份证的三种方法。Session_id()是最可靠的。我注意到firefox没有得到SID,Internet Explorer没有得到
    PHPSESSID
    。这两种方法都可以报告会话id。

    用户可以禁用Javascript,因此您的方法可以被绕过。vercookie看起来很有前途。人们无论如何都需要启用javascript才能使用该网站,而且它仍然比使用Java要好,因为很多用户禁用了Java。将删除我的答案,因为这与Java完全相同。只有相关的附加信息:“由于cookie是针对每个浏览器的,而不是针对每台计算机的,因此您可以限制每个IP使用一个特定的浏览器”,并让我们知道您的进度@在最坏的情况下,sunn0会迫使人们使用不同的浏览器。如果我找到一种对我或用户来说都不麻烦的方法,我会让你知道。如果不使用X-Forwarded-for标头,如果你结合建议的答案,这将迫使同一IP上的用户使用相同的浏览器。我认为这是最好的。如果用户使用多个帐户,检查用户是否登录也没有帮助。我知道这些不起作用,所以,我想知道的是,还有什么能起作用?但这不能让两个室友同时连接到不同的帐户,我想提供给我的用户。是的,但是你必须放弃没有人能入侵你的系统的想法。。就像在系统上作弊一样,如果你真的想,我不相信我的系统不会崩溃,这足以阻止人们这么做。如果计算机使用相同的cookie,则无论sam上的浏览器如何,使用代理都没有帮助