【问题标题】:How set session timeliness?如何设置会话时效?
【发布时间】:2014-06-10 01:15:09
【问题描述】:

在我的项目中,我需要设置单独的方法来设置会话实时: 1) 如果用户设置“记住我”-> 将信息写入 cookie -> 如果 cookie 变量可用,则设置 session time-live 未设置(尽可能长)。当用户从 cookie 重新加载页面信息时写入会话变量。如果用户关闭浏览器,则再次打开浏览器并从 cookie 重新启动会话加载站点 -> 信息(如果 cookie 信息可用)。 2)如果用户未设置“记住我”会话必须从我们的 24 日(1 天)到期。

session_set_cookie_params(3600);
session_start(); 
include ("blocks/bd.php");

if (isset($_COOKIE['passwordCode'])) {
    $passwordCode = $_COOKIE['passwordCode'];
    $login = $_COOKIE['login'];
    $personalInfo = mysql_query("SELECT * FROM users WHERE password='$passwordCode' AND login='$login'", $db);
    $personalInfoData =  mysql_fetch_array($personalInfo);      

    $_SESSION['password'] = $personalInfoData['password'];
    $_SESSION['login'] = $personalInfoData['login'];
    $_SESSION['userName'] = $personalInfoData['userName'];
    $_SESSION['phone'] = $personalInfoData['phone'];
    $_SESSION['email'] = $personalInfoData['email'];
    $_SESSION['id'] = $personalInfoData['id'];
    $_SESSION['role'] = $personalInfoData['role'];
    $_SESSION['companyRelation'] = $personalInfoData['companyRelation'];
}
if (isset($_SESSION['login']) && isset($_SESSION['password'])) {
    $personalInfo = mysql_query("SELECT * FROM users WHERE password='$_SESSION[password]' AND login='$_SESSION[login]'", $db);
    $personalInfoData =  mysql_fetch_array($personalInfo);


}

使用此代码会话设置时间无法正常工作。

【问题讨论】:

  • 您的代码根本不做任何事情来处理您的数据库登录查询不返回结果的情况。另外,如果您已经登录了用户,为什么要在每次加载页面时重新查询数据库以获取用户信息?您应该能够将其存储在会话中。除此之外,我不确定你在这里问什么。

标签: php session-cookies session-timeout


【解决方案1】:

我不完全确定第一个选项 (1) 的含义,但“记住我”会话将在 24 小时后到期:

您可以设置您想要的会话(比如$_SESSION['username']),除此之外,还可以设置一个会话,指定它的创建时间。让我演示一下:

if (isset($_SESSION['expire'])) {
  unset($_SESSION['expire']);
}
$_SESSION['username'] = $username;
$_SESSION['expire'] = time();

当你想验证会话是否有效时,你可以使用这个:

if ($_SESSION['expire']+86400 < time()) {
  unset($_SESSION['username']);
  unset($_SESSION['expire']);
}

【讨论】:

    【解决方案2】:

    首先:

    切勿将密码存储在会话或 cookie 中!这是非常非常糟糕的做法,会使您的脚本非常容易受到攻击。

    其次:

    切勿将密码以纯文本形式存储在任何地方。加盐,散列,然后储存。

    每个用户的密码都是有价值的;如此对待它。它不仅代表对您的脚本的访问,还代表对他们的电子邮件和其他站点的潜在访问。我知道我在很多地方都使用相同的密码,而且我知道很多其他人也这样做。

    您可以在网上的各个地方阅读更多相关信息,例如http://phpsec.org/projects/guide/1.html

    现在,关于实际答案...

    捕捉最后的动作时间

    您没有指定会话应该从用户登录时开始,还是从用户最后一次执行操作时开始,但我假设是后者。

    当用户登录时,将用户超时首选项保存在 cookie 中。然后,在每个页面上,将当前时间戳保存到 cookie 中。我们可以使用这个 cookie 来检查自上次页面重新加载以来已经过去了多少时间。

    接下来,我们检查用户超时设置。如果是“记住我”,我们就让会话继续下去。如果是“不记得我”,我们检查用户上次执行操作的时间。将此时间与当前时间进行比较,看看是否已经过了 24 小时。如果有,请终止会话。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2020-01-03
      相关资源
      最近更新 更多