PHP,会话和退出浏览器

时间:2014-03-05 03:30:55

标签: php session

我正在构建一个允许用户登录数据库后端并更新一些记录的Web应用程序。无论如何,我不是一个专业的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;
}

2 个答案:

答案 0 :(得分:0)

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

示例:如果您使用数据库来保存用户的登录名和密码(如果您使用,则应使用盐进行哈希处理),然后设置历史记录表(无论如何都应该是活动的)。它记录每个人登录的时间和ip(为了将来的安全性)。在此历史记录中将是首次登录和上次活动的时间戳,当用户刷新页面或执行任何操作时,它将刷新上次活动时间戳。任何操作都应该从检查那个用户名的最后两次登录开始,如果差距很大(你说15分钟)是一个自动的session_unset并在其他任何事情完成之前销毁。

答案 1 :(得分: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调用以说明标签的关闭,但它不可靠。