我正在构建一个允许用户登录数据库后端并更新一些记录的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;
}
答案 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调用以说明标签的关闭,但它不可靠。