我使用基于 SESSION vars 的简单登录系统。用户登录后,会设置一个会话变量,告诉我的脚本将接受该用户。我不使用任何自定义客户端 cookie 变量。
我想在登录屏幕上提供“让我全天登录”的选项。如何以安全的方式做到这一点?
我使用基于 SESSION vars 的简单登录系统。用户登录后,会设置一个会话变量,告诉我的脚本将接受该用户。我不使用任何自定义客户端 cookie 变量。
我想在登录屏幕上提供“让我全天登录”的选项。如何以安全的方式做到这一点?
首先: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);
}
编辑:您可能要考虑的一件事是会话固定和/或会话劫持。为了防止这种情况,我推荐两种解决方案中的一种(或两种):
session_regenerate_id()每次成功登录尝试后使用。当你说“让我整天登录”时,我假设你的意思是只在特定的机器上,对吗?您可以使用 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']);
}
一种选择可能是设置一个 MySQL 表来保存会话变量并将它们与 IP 地址和到期时间相关联,但我不确定如何实现的所有细节。
最简单(尽管不推荐)的方法是$_COOKIE在计算机上使用用户名和密码设置 a ,然后您的站点将在用户登录时检查它们。
为了增加安全性,您最好只将一个 cookie 保存为用户数据的加盐 MD5 哈希,以便为潜在的黑客提供较少的有关用户帐户数据的信息。设置cookie时可以设置持续时间;php.net有关于如何做到这一点的相当完整的文档。