2010-10-23 101 views
3

我发展,你不允许在多个帐户登录一台计算机上的网站,但我不知道如何做到这一点。该方法必须是:PHP/Java脚本:分辨两台电脑从同一网络

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

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

任何提示?

回答

2

编辑:我认为我的回答一个黑客,希望能看到一个最佳实践方案。

就像我讨厌他们一样,检查Flash Cookies会在这里工作。大多数用户甚至不知道他们甚至在电脑上,所以你不必担心他们被删除。进入这个链接,看看有多少一直坐在您的计算机上的年龄没有您的知识:Flash Cookie Manager

虽然我不认为Flash可以和iPhone一起工作,但是你没有提到它。

这里是土坯的闪光install baseWikipedia也有Flash穿透。

+0

这似乎是我的问题的答案,要更彻底地进行调查。如果可以相信Adobe的数字,几乎每个人都会启动Flash。应该能够想出一些可以让iPhones或类似的连接。我会看看我能用这些信息做些什么。 – user485158 2010-10-23 18:24:36

+0

这是相当可怕的一些未知的曲奇... ** dammit **。 (为了向我展示我存储在我的系统中的多少,我从来不知道)。 – 2010-10-23 18:25:51

4

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

然后,所有你需要做的是链接,cookie来您的会话处理架构。

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

使用验证IP地址的所有的方法有2个问题: - 任何人都可以使用代理服务器绕过它们 - 它不会对NAT的enviroments

+0

用户可以禁用了JavaScript,因此你的方法可以绕过 – Claudiu 2010-10-23 16:43:09

+0

Evercookie看起来很有希望。无论如何,人们需要启用JavaScript才能使用该站点,并且仍然比使用Java的用户数量更多,而这些用户禁用了更多。 – user485158 2010-10-23 17:38:04

+0

将删除我的答案,因为这完全一样。只有相关的附加信息:“由于Cookie是每个浏览器,而不是每台计算机,你也许可以限制每个IP一个特定浏览器的使用”,让我们知道您的进步! – sunn0 2010-10-23 18:02:22

0

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

+0

但是,这不会让两个室友同时与不同的账户连接,我想向我的用户提供。 – user485158 2010-10-23 17:15:10

+0

是的,但你必须退出这样的想法,即没有人能够打入你的系统......就像在系统上作弊 – Claudiu 2010-10-23 17:36:12

+0

我不相信如果你真的想要我的系统不会破坏,不鼓励人们这样做。如果计算机使用相同的cookie,无论同一台计算机上的浏览器如何,使用代理服务器都无济于事,这似乎是我必须走下坡路。 – user485158 2010-10-23 17:41:28

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 
..... 

这样,如果在与用户B的尝试登录用户A,你可以运行检查,看是否该IP已经被使用过,如果有,那么你只运行一个直接注销,否则你可以要求注册时提供机密问题,以帮助的事情在安全性方面

+0

只要在两台不同的计算机上,这仍然不允许来自同一个IP的两个连接。 – user485158 2010-10-23 17:18:27

+0

你不能从同一个ip同时连接不同的控制台。 – RobertPitt 2010-10-23 19:57:42

+0

问题不在于每个IP只允许一个会话(不会被强制),也不会同时从不同的位置登录(这是不可能的)。问题是每台计算机只允许一个会话。同一网络下的多台计算机应能够登录,但每台计算机只能有一个活动会话。 – user485158 2010-10-23 20:30:10

0

你可以只把数据库中有一列(IsLoggedIn)指示一个人当前是否登录?

的事情,是行不通的,为什么:

  1. IP:本地局域网内所有人都在路由器后面会出现你的网站具有相同的IP地址。

  2. Cookie:它们依赖于浏览器。例如, IE不会在Firefox中知道。

+0

检查用户是否登录不会帮助他们使用多个帐户。我知道那些行不通,所以,我想知道的是,还有什么可行的? – user485158 2010-10-23 17:12:20

1

的唯一方法是通过客户端的IP地址,来区分作为别人讲到这里,但是如果你的用户将是代理服务器后面的事情得到了很多麻烦。

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

要获得X - 转发,对于价值在PHP中:

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

这样可以保护您至少免遭非高级用户的非常明显的误用。

+0

有用,证明它可以完成,但不幸的是,如您所述,它可以由高级攻击者伪造。这使得这种方法无用。 – user485158 2010-10-23 17:21:55

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。

相关问题