2014-03-05 81 views
0

我正在构建一个Web应用程序,允许用户登录到数据库后端并更新一些记录。我不是一个专业的PHP开发人员。PHP,会话和退出浏览器

我刚刚注意到,打开Chrome浏览器后,浏览到最后一页,它是在几天前(重新启动之间),这是网站的网页之一,你只能登录后访问。我认为这很奇怪,因为会议应该过期了。

在每个页面的顶部,我有:

session_start(); 

如果到后端的用户登录成功我这样设置会话变量:

$_SESSION['userAuthenticated'] = TRUE; 

如果用户点击注销按钮它这样做:

$_SESSION = array(); 
session_unset(); 
session_destroy(); 

在我的php.ini文件中我有以下设置:

session.cookie_lifetime 0 (0 for both local value and master value) 
session.gc_maxlifetime 900 (900 for both local value and master value) 

这是我的理解,会话将保持活动15分钟,并在用户完全退出浏览器时被销毁。我刚刚测试过,我可以完全退出浏览器,再次打开它并访问其中一个应该需要登录的页面。

难道我做错了这里 - 我不能总是指望用户点击退出按钮,但我希​​望在会议上没有任何工作15分钟后,或者如果他们放弃他们的浏览器完全。

更新:这是我如何检查,如果用户已通过身份验证:

if (!isset($_SESSION['userAuthenticated']) and $_SESSION['userAuthenticated'] !== TRUE) { 
header('Location: index.php'); 
die; 
} 
+0

'$ _SESSION = array();'不是必需的。此外,请显示您如何检查'$ _SESSION ['userAuthenticated']'以验证用户是否登录。 – Raptor

+0

您可能正在从缓存中加载页面。如果刷新,它是否仍显示为已登录? (!isset($ _ SESSION ['userAuthenticated'])和$ _SESSION ['userAuthenticated']!== TRUE){ – Mike

+0

@Raptor - 我正在使用它来验证用户是否已验证: header :index.php'); 死亡; } – user982124

回答

0

老实说,你应该使用在服务器端更直接的时间安排方案,并在会话超时不计。作为程序员,我们必须尽可能控制。

例如:如果你使用一个数据库,以保持用户的登录名和密码(这应该与盐,如果你是被散列),然后有历史的表格设置(这应该是积极反正)。它跟踪每个人何时登录以及什么ip(为了将来的安全)。在这个历史记录中,将是第一次登录和最后一次活动的时间戳,当用户刷新页面或执行任何操作时,它将刷新上次活动时间戳。任何操作都应该从检查那个用户名的最后一次登录名的两个开始,如果差距很大(你说的15分钟)是一个自动session_unset并且在其他任何事情完成之前销毁。

0

PHP上的会话使用Cookie类型的会话,在服务器端,会话信息不断删除。要设置会话生命周期,你可以在session_start前使用session_set_cookie_params功能:当整个浏览器处理退出

session_set_cookie_params(3600,"/"); // 3600 seconds (1 hour) OR 900 for 15 mins 
session_start(); 

浏览器只会破坏会话cookie。没有可靠的方法来确定用户是否/何时关闭了选项卡。有一个onbeforeunload处理程序可以附加到,并希望设法做一个Ajax调用服务器说标签的关闭,但它是不可靠的。

相关问题