5

我使用基于 SESSION vars 的简单登录系统。用户登录后,会设置一个会话变量,告诉我的脚本将接受该用户。我不使用任何自定义客户端 cookie 变量。

我想在登录屏幕上提供“让我全天登录”的选项。如何以安全的方式做到这一点?

4

3 回答 3

14

首先:session.cookie_lifetime在 php.ini、配置文件或通过session_set_cookie_params().

接下来,将用户名和密码的哈希值存储在会话中,并在每个页面上验证该登录。只要它仍然有效,他们就可以保持登录状态。

会话 cookie 的自然到期通常应该使事情保持整洁,因为如果他们保持活动状态,您将不会让任何人在他们的会话中间注销(当然,如果星星对齐的话)。但是,如果做不到这一点,我会考虑 eCartoth 的解决方案,因为您可以在 if 语句中添加第二行:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

编辑:您可能要考虑的一件事是会话固定和/或会话劫持。为了防止这种情况,我推荐两种解决方案中的一种(或两种):

  1. 在会话中存储用户的 IP 地址
  2. session_regenerate_id()每次成功登录尝试后使用。
于 2009-12-18T17:28:08.147 回答
3

当你说“让我整天登录”时,我假设你的意思是只在特定的机器上,对吗?您可以使用 mysql 表来记住“登录时间”,或者如果他们选择全天保持登录状态,则该登录将不再有效的时间戳。然后在代码的开头添加一些脚本,从会话变量中检索该用户的 id。将该用户的当前时间戳与存储的“最后一个有效 ts”进行比较,如果超过该时间,您就知道他们应该被注销,此时您擦除会话并强制用户再次登录。这种方法意味着他们实际上不会被注销,直到他们尝试做一些过去的事情,但对他们来说似乎是这样。还,

因此,例如,当用户第一次使用“选择让我全天登录”登录时:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

然后每次在您的系统中访问一个页面时:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}
于 2009-12-18T17:05:16.053 回答
2

一种选择可能是设置一个 MySQL 表来保存会话变量并将它们与 IP 地址和到期时间相关联,但我不确定如何实现的所有细节。

最简单(尽管推荐)的方法是$_COOKIE在计算机上使用用户名和密码设置 a ,然后您的站点将在用户登录时检查它们。

为了增加安全性,您最好只将一个 cookie 保存为用户数据的加盐 MD5 哈希,以便为潜在的黑客提供较少的有关用户帐户数据的信息。设置cookie时可以设置持续时间;php.net有关于如何做到这一点的相当完整的文档。

于 2009-12-18T16:45:01.807 回答