【问题标题】:PHP, Sessions and Quitting BrowserPHP、会话和退出浏览器
【发布时间】:2014-03-05 03:30:55
【问题描述】:

我正在构建一个 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;
}

【问题讨论】:

  • $_SESSION = array(); 不是必需的。另外,请说明您如何检查$_SESSION['userAuthenticated'] 以验证用户是否登录。
  • 您可能正在从缓存中加载页面。刷新后是否仍显示为已登录?
  • @Raptor - 我正在使用它来验证用户是否经过身份验证: if (!isset($_SESSION['userAuthenticated']) 和 $_SESSION['userAuthenticated'] !== TRUE) { header('位置:index.php');死; }
  • @Mike 是的,如果我刷新或导航到另一个页面,它可以工作 - 每个页面都必须访问后端数据库来检索数据,因此如果它们没有经过身份验证,它将无法工作
  • @user982124 而不是使用and 使用or。例如,如果您将$_SESSION['userAuthenticated'] 设置为false,则使用您现在拥有的代码,用户将登录。

标签: php session


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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 调用来说明选项卡的关闭,但这并不可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2012-06-06
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多