PHP / Javascript:告诉两台计算机除了同一个网络

时间:2010-10-23 16:34:20

标签: php javascript networking local

我正在开发一个网站,您无法在一台计算机上登录多个帐户,但我不知道该怎么做。方法必须是:

  • 跨平台(可在Windows / Mac / Linux客户端上使用)。
  • 独立于浏览器。

这是为了避免一些用户利用多个用户获得不公平的优势,同时仍允许本地网络上的两个人连接,只要他们在不同的计算机上。

任何提示?

7 个答案:

答案 0 :(得分:4)

您可以尝试使用持久性Cookie,例如“Evercookie”http://samy.pl/evercookie/,这样您就可以识别出具有独特Cookie的每台计算机,并且它会持久存在。

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

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

使用IP地址进行验证的所有方法都有两个问题:   - 任何人都可以使用代理并绕过它们   - 它不适用于NAT'ed环境

答案 1 :(得分:2)

编辑:我认为我的答案是黑客,并希望看到最佳实践替代方案。

尽管我讨厌他们,但是对Flash Cookies进行检查可以在这里工作。大多数用户不知道他们甚至在计算机上,所以你不必担心他们被删除。转到此链接,查看有多少人在您不知情的情况下长时间坐在您的计算机上:Flash Cookie Manager

我不认为Flash适用于iPhone,但你没有提到它。

这是adobe对flash install base的看法。 Wikipedia也对闪存渗透有所了解。

答案 2 :(得分:1)

唯一的方法是区分客户端的IP地址,就像其他人提到的那样,但是如果你的用户会落后于代理,事情会变得更加棘手。

在代理中有一个事实上的标准来添加一个名为“X-Forwarded-For”的HTTP标头,它反映了客户端的内部IP。这对$ _SERVER ['REMOTE_ADDR']加上X-Forwarded-For的值原则上为您提供了客户机器的唯一标识。但是,X-Forwarded-For可以由使用真实IP地址的高级攻击者轻松伪造。

在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'将为您提供几乎可靠的标识,以存储在您的会话数据中,并与每个新创建的会话进行比较。

这将至少保护您免受非高级用户非常明显的误用。

答案 3 :(得分:1)

会话ID应该足以让他们分开。

试试这个:

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

显示您的ID的三种方法。 Session_id()是最可靠的。我注意到firefox没有获得SID,Internet Explorer没有获得PHPSESSID。两者都报告session_id。

答案 4 :(得分:0)

我看到的唯一方法是通过IP检查,如果你已经连接了$ _SERVER ['REMOTE_ADDR'],那么就不要让任何其他的。当然,在某些情况下,您可以在两台不同的PC上使用相同的IP,但这是最安全的方式,因此您的用户应该了解它。

答案 5 :(得分:0)

您需要考虑几个因素。

确保每个IP地址只有1个会话将是最好的方法,唯一的缺点是如果用户没有注销你可能有问题。

我会做的是

将用户登录到表中并跟踪最后一项活动,如果您的站点是用户可能暂时不更改页面的站点,那么您应该设置一个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是否已被使用过,如果有,则只需运行直接注销,否则您可以提出一个秘密问题在注册时提供帮助安全方面的事情

答案 6 :(得分:0)

您可以在数据库中放置一个位列(IsLoggedIn),指示某人当前是否已登录?

不起作用的事情和原因:

  1. IP:路由器后面的本地局域网内的每个人都会在您的网站上显示为具有相同的IP地址。

  2. Cookie:它们取决于浏览器。例如,一个cookie IE不会在Firefox中出现。