2010-03-30 60 views
2

我想了解PHP应用程式如何检查,以查看用户是否登录。我专门找在MediaWiki的代码,试图帮助我理解,但这些情况应该在所有的PHP应用相当普遍。会话超时后,php应用如何识别用户?

从我所收集的主要情况是:

  1. 用户只需登录或创建,他们每次访问的页面PHP知道通过检查常见到$ _SESSION变量数据的他们, cookie。

  2. 用户有一个很久以前的“记住我”选项登录页面上选中。他们在那里有一个cookie的计算机与tokenID,这是与服务器上的一个令牌进行检查,以验证它们。在这种情况下,没有会话变量,因为访问之间的时间可能是几周。

我的问题是,当用户登录时会发生什么,但PHP会话超时并且他想访问一个页面?我会假设服务器没有简单的方法知道这个人是谁 - 而且他们必须重定向到登录页面。

然而,链接到MediaWiki做到了这一点。我已经验证会话文件在X分钟后被删除,但是当我在mediawiki中进行刷新时,它会知道我是哪个用户,并且cookie中不包含“token”变量。

回答

0

粘粘的问题。那么,大多数“记住我”功能是通过使用cookie来实现的,它存储了一个验证用户的“令牌”。

如果不这样做,并没有cookie被发送到服务器,唯一可行的办法是,服务器被“猜测”,这是你根据参数的序列。这些参数可能包括:IP,用户代理字符串等......但这可能在很多情况下都有效,但由于它代表安全风险,因此它不被认为是最佳实践。防爆。许多用户正在共享网络,代理服务器等......这可能会在最糟的情况下让用户登录到某个elses帐户。

1

答案是cookies。当会话过期时,除了浏览器发送的内容外,服务器无法识别用户。那么应用程序会使用cookie数据来透明地重建会话。如果cookie已过期或被删除,那么重定向到登录页面实际上是唯一的选择。

+0

还要注意的是cookie可能只有被保存在内存中,而不是保存到磁盘,所以你不一定会看到cookie文件中的令牌。在这种情况下,会话可以通过内存中的cookie重新创建,但是如果浏览器关闭,cookie数据将丢失,用户将重定向到登录页面。 – 2010-03-30 18:22:03

4

如果您不想再直接到当会话过期的登录页面,当用户登录(选中“记住我”的东西)一个已经创建的cookie绝包含足够的信息来重新创建会话

并重新创建一个会话意味着重新登录用户。

这意味着该Cookie必须包含足够的数据来识别用户。


当然,你不能存储在cookie登录+密码,至少在纯明文,饼干经过与每个HTTP请求的网络;不会很安全。

但你必须找到一种方法来存储...足够的数据;比如登录,可能还有一些可以用来确定用户是否真的在cookie中登录的用户的散列。

这里有一对夫妇的问题+答案可能是有趣,有关:

+0

只要扩展一下,就可以将散列存储在数据库的'users'表中,就像从随机数中产生'lastLoginHash'一样。当他们返回时,您会检查cookie中的用户名和散列。如果它们匹配,则登录它们,否则重定向它们。 – Tarka 2010-03-30 18:21:08