【问题标题】:Session should never expire by itself会话不应自行过期
【发布时间】:2010-11-22 13:51:38
【问题描述】:

我在我的站点中使用登录功能进行会话。 无论用户是否注销,我的这个会话都会在几分钟后过期。 现在我想要的是会话应该只在用户注销时过期。如果用户没有注销他的帐户,然后在 2-3 天后回来,即使这样,他也应该显示为已登录。

我发现了一些示例,它们增加了会话到期的时间,但我希望它只应在用户注销事件时到期,而不管他注销所用的时间。

我该怎么做?

特别是,这样做是否正确?

session_cache_expire(0);
session_start();

【问题讨论】:

    标签: php session session-timeout


    【解决方案1】:

    在这种情况下,经常使用的解决方案是:

    • 有一个不太长的会话持续时间:如果用户不活跃,它将过期(这正是它的工作方式 - 如果您有很多用户,这对您的服务器更好)
    • 当用户登录时,您设置了一个 cookie,其中包含识别他所需的内容
    • 如果他返回网站(使用 cookie,并且没有活动会话),您可以使用该 cookie 中包含的信息让他自动登录,同时重新创建会话。李>

    这边:

    • 您没有充分的理由没有“活跃”的数千个会话
    • 您保持会话工作的标准方式

    至少从用户的角度来看,您具有“永远不会被注销”的优势。

    另请注意,对于“正常”会话,包含会话 ID 的 cookie 将在用户关闭浏览器时被删除 - 因此,无论会话的生命周期有多长,他都会断开连接。
    通过我提出的解决方案,您可以设置 cookie 应在用户计算机上保留多长时间 ;-)


    但是,这意味着,当用户手动注销时,您当然必须删除他的会话和 cookie,因此他不会立即重新自动登录。


    当然,你必须小心你在 cookie 中设置的内容:cookie 不是很安全,所以不要在其中存储密码,例如 ;-)


    实际上,这种做事方式就是“记住我”功能通常的工作方式;除了,在这里,您的用户无需选中复选框即可激活“记住我”;-)


    如果你没有时间开发那种东西,一个非常快速和肮脏的方法是在你的所有页面上使用一些 Ajax 请求,这只会在服务器上“ping”一个 PHP 页面——这将保持会话处于活动状态(但这不是一种很好的做事方式:服务器上仍然会有很多会话,会有很多无用的请求......而且只要用户不这样做,它就会起作用关闭他的浏览器)。

    【讨论】:

    • 我设置了一个cookie,其中包含用户名和一个随机数连接到它,然后我将它存储到数据库中。当一个页面被调用时,我检查系统cookie并将其与数据库中的cookie匹配,如果两者都匹配,那么我将显示该人登录,否则不显示。当一个人注销时,我将cookie设置为null。这是正确的方法吗???这安全吗???
    • 至少对我来说似乎还可以——它永远不会是“完美的安全性”,因为任何使用该人计算机的人都会自动登录,但这应该足够了,我想:- )
    • 我知道它是一个相当老的线程,但我可以通过在我的 php.ini 文件中将 session.gc_maxlifetime 和 session.cookie_lifetime 设置为 0 来做到这一点吗?
    • @void,不在 Debian 系统或其他系统上,其中一个单独的垃圾收集 cron 作业会获取早于某个超时(默认为 30 分钟)的会话文件,而不管(本机)PHP 配置如何。参见例如serverfault.com/a/511705
    【解决方案2】:

    您不能仅通过 PHP 内部会话处理来做到这一点。 PHP 将始终在会话 cookie 中发送会话 id,当用户关闭浏览器时,该会话 id 将过期。为了实现某种自动登录,您需要一些附带的代码,在用户浏览器上设置一个更持久的 cookie,并处理这些 cookie 的识别以及 cookie 值和相应用户帐户之间的映射。

    请注意,这会极大地影响安全问题,因此您必须处理很多事情。请阅读以下内容,了解可能的自动登录功能如何工作:

    【讨论】:

    【解决方案3】:

    您是否在测试时删除了您的 cookie?是否启用了 cookie?您是否在代码中的某处破坏了会话?

    另外,请参阅我对另一篇帖子的回答:Quick question about sessions in PHP,其中解释了如何保持登录状态。如果您希望用户永远保持登录状态,请不要执行 cronjob/计划任务。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2012-07-06
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多