我发展,你不允许在多个帐户登录一台计算机上的网站,但我不知道如何做到这一点。该方法必须是:PHP/Java脚本:分辨两台电脑从同一网络
- 跨平台(可在Windows/Mac/Linux客户端上使用)。
- 独立于浏览器。
这是为了避免一些用户利用多个用户获得不公平的优势,同时仍然允许两个人在本地网络上连接,只要他们在不同的计算机上。
任何提示?
我发展,你不允许在多个帐户登录一台计算机上的网站,但我不知道如何做到这一点。该方法必须是:PHP/Java脚本:分辨两台电脑从同一网络
这是为了避免一些用户利用多个用户获得不公平的优势,同时仍然允许两个人在本地网络上连接,只要他们在不同的计算机上。
任何提示?
编辑:我认为我的回答一个黑客,希望能看到一个最佳实践方案。
就像我讨厌他们一样,检查Flash Cookies会在这里工作。大多数用户甚至不知道他们甚至在电脑上,所以你不必担心他们被删除。进入这个链接,看看有多少一直坐在您的计算机上的年龄没有您的知识:Flash Cookie Manager。
虽然我不认为Flash可以和iPhone一起工作,但是你没有提到它。
这里是土坯的闪光install base。 Wikipedia也有Flash穿透。
您可以尝试使用持久性Cookie,如“Evercookie”http://samy.pl/evercookie/,这样您可以识别每台计算机具有独特的cookie,并且它会持久。
然后,所有你需要做的是链接,cookie来您的会话处理架构。
编辑: 正如Claudiu指出的那样,您还需要检查用户是否已启用JS,并在禁用的情况下拒绝访问。
使用验证IP地址的所有的方法有2个问题: - 任何人都可以使用代理服务器绕过它们 - 它不会对NAT的enviroments
用户可以禁用了JavaScript,因此你的方法可以绕过 – Claudiu 2010-10-23 16:43:09
Evercookie看起来很有希望。无论如何,人们需要启用JavaScript才能使用该站点,并且仍然比使用Java的用户数量更多,而这些用户禁用了更多。 – user485158 2010-10-23 17:38:04
将删除我的答案,因为这完全一样。只有相关的附加信息:“由于Cookie是每个浏览器,而不是每台计算机,你也许可以限制每个IP一个特定浏览器的使用”,让我们知道您的进步! – sunn0 2010-10-23 18:02:22
我看到的唯一方法是通过IP来检查工作,如果你已经连接了$ _SERVER ['REMOTE_ADDR'],那么不要让其他任何一个。当然,在某些情况下,您可以在两台不同的PC上拥有相同的IP,但这是最安全的方式,因此您的用户应该意识到这一点。
但是,这不会让两个室友同时与不同的账户连接,我想向我的用户提供。 – user485158 2010-10-23 17:15:10
是的,但你必须退出这样的想法,即没有人能够打入你的系统......就像在系统上作弊 – Claudiu 2010-10-23 17:36:12
我不相信如果你真的想要我的系统不会破坏,不鼓励人们这样做。如果计算机使用相同的cookie,无论同一台计算机上的浏览器如何,使用代理服务器都无济于事,这似乎是我必须走下坡路。 – user485158 2010-10-23 17:41:28
即使世界,你需要看几个因素。
确保有每个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已经被使用过,如果有,那么你只运行一个直接注销,否则你可以要求注册时提供机密问题,以帮助的事情在安全性方面
只要在两台不同的计算机上,这仍然不允许来自同一个IP的两个连接。 – user485158 2010-10-23 17:18:27
你不能从同一个ip同时连接不同的控制台。 – RobertPitt 2010-10-23 19:57:42
问题不在于每个IP只允许一个会话(不会被强制),也不会同时从不同的位置登录(这是不可能的)。问题是每台计算机只允许一个会话。同一网络下的多台计算机应能够登录,但每台计算机只能有一个活动会话。 – user485158 2010-10-23 20:30:10
你可以只把数据库中有一列(IsLoggedIn)指示一个人当前是否登录?
的事情,是行不通的,为什么:
IP:本地局域网内所有人都在路由器后面会出现你的网站具有相同的IP地址。
Cookie:它们依赖于浏览器。例如, IE不会在Firefox中知道。
检查用户是否登录不会帮助他们使用多个帐户。我知道那些行不通,所以,我想知道的是,还有什么可行的? – user485158 2010-10-23 17:12:20
的唯一方法是通过客户端的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'会为您提供几乎可靠的标识,以存储在会话数据中并与每个新创建的会话进行比较。
这样可以保护您至少免遭非高级用户的非常明显的误用。
有用,证明它可以完成,但不幸的是,如您所述,它可以由高级攻击者伪造。这使得这种方法无用。 – user485158 2010-10-23 17:21:55
会话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。
这似乎是我的问题的答案,要更彻底地进行调查。如果可以相信Adobe的数字,几乎每个人都会启动Flash。应该能够想出一些可以让iPhones或类似的连接。我会看看我能用这些信息做些什么。 – user485158 2010-10-23 18:24:36
这是相当可怕的一些未知的曲奇... ** dammit **。 (为了向我展示我存储在我的系统中的多少,我从来不知道)。 – 2010-10-23 18:25:51