如何创建一个安全的PHP登录系统,允许"让我登录"功能?

pix*_*ine 5 php login login-script remember-me

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

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

Der*_*sed 14

第一步:session.cookie_lifetime在php.ini,配置文件或via中配置指令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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:你可能想要考虑的一件事是会话固定和/或会话劫持.为了防止这种情况,我建议使用两种解决方案中的一种(或两种):

  1. 将用户的IP地址存储在会话中
  2. session_regenerate_id()每次成功登录尝试后使用.

  • PHP接受多种机制来指定会话ID(例如查询字符串),允许某人设置预定的会话ID,通过URL将其发送给不知情的受害者,一旦他们登录恶意用户,就可以使用相同的会话用于伪造存储在会话中的合法用户的登录凭据的ID.通过在每个请求上存储IP和/或重新生成会话ID,恶意用户的"固定"会话ID实际上是毫无价值的.阅读本文以获取更多信息:http://en.wikipedia.org/wiki/Session_fixation (2认同)