我正在开发一个网站,不允许您在一台计算机上登录多个帐户,但我不知道如何做到这一点。方法必须是:
- Cross-platform (can be used on Windows/Mac/Linux clients).
- Browser independent.
这是为了避免一些用户利用多个用户来获得不公平的优势,同时仍然允许本地网络上的两个人连接,只要他们在不同的计算机上。
有什么建议吗?
我正在开发一个网站,不允许您在一台计算机上登录多个帐户,但我不知道如何做到这一点。方法必须是:
这是为了避免一些用户利用多个用户来获得不公平的优势,同时仍然允许本地网络上的两个人连接,只要他们在不同的计算机上。
有什么建议吗?
编辑:我认为我的答案是一个破解,并希望看到一个最佳实践的替代方案。
尽管我很讨厌他们,但还是要对照Flash Cookie在这里可以使用。大多数用户甚至不知道他们在电脑上,所以你不必太担心他们会被删除。转到此链接,看看有多少人在你不知情的情况下在你的电脑上坐了很长时间:Flash Cookie管理器。
我认为Flash不适用于iPhone,但你没有提到它。
您可以尝试使用持久Cookie,如“Evercookie”http://samy.pl/evercookie/,这样您就可以用一个独特的cookie来识别每台计算机,并且它将是持久的。
然后,您所需要做的就是将cookie链接到您的会话处理模式。
Edit: As Claudiu pointed out, you ll also need to check the user has JS enabled, and deny access in the case it s disabled.
All methodologies using IP address for verification have 2 issues: - Anyone could use a proxy and bypass them - It wont work with on NAT ed enviroments
会话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没有得到PHPSSID
。两者都报告session_id。
唯一的方法是根据客户端的IP地址进行区分,正如这里提到的其他方法一样,然而,如果你的用户将在代理后面,事情就会变得更加棘手。
代理之间有一个事实上的标准,可以添加一个名为“X-Forwarded-For”的HTTP标头,该标头反映客户端的内部IP。原则上,$_SERVER[REMOTE_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,它将为您提供几乎可靠的标识,存储在会话数据中,并与每个新创建的会话进行比较。
这将保护您至少免受非高级用户的明显滥用。
我看到的唯一方法是通过IP进行检查,如果您已经连接了$_SERVER[REMOTE_ADDR],那么不要让任何其他连接。当然,在某些情况下,你可以在两台不同的电脑上拥有相同的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以前是否使用过,如果使用过,那么您只需直接注销,否则您可以在注册时提出一个秘密问题,以帮助解决安全问题
你可以在数据库中放一个位列(IsLoggedIn),指示某人当前是否登录?
不起作用的事情以及原因:
IP:路由器后面的本地局域网内的每个人在您的网站上都会显示为具有相同的IP地址。
Cookie:它们依赖于浏览器。IE中的cookie在Firefox中是未知的。
How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.
I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...
Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...
Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...
I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...
Is it possible for someone to give me a few pointers on how to display a multidimensional array in the form of a bar graph? The array is multidimensional, with three elements in each part - and the ...
Is it possible to reload a form after file-input change? I have a form where the user can chose an image for upload. I also have a php script which displays that image resized. I only wonder if it ...
I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.