我目前使用会话将用户登录到我的站点。现在,我想将 cookie 添加到组合中,以便人们可以在几天后访问该站点而不必再次登录。
我不想将密码存储在 cookie 中,或加密任何东西 - 所以我的解决方案是将用户名存储在 cookie 中,并使用某种登录哈希(特定于每个用户的每次登录)创建另一个 cookie。然后,在每个页面的顶部,检查 cookie 和登录会话。如果 cookie 存在但会话不存在,请找到用户名并登录用户。
因此,这将在他们成功登录后发生($row['username']
是他们输入的用户名):
$_SESSION['username']=$row[username];
$_SESSION['user_id']=$row['id'];
$loginhash = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 32);
$number_of_days = 14;
$date_of_expiry = time() + 60 * 60 * 24 * $number_of_days ;
setcookie( "userlogin", $row['username'], $date_of_expiry, "/" ) ;
setcookie( "loginhash", $loginhash, $date_of_expiry, "/" ) ;
$today=date("Y-m-d");
mysql_query("update members set last_login='$today',loginhash='$loginhash' where id='$row[id]' ") or die(mysql_error());
然后在每个页面的顶部,执行以下操作:
if($_COOKIE['userlogin'] && !isset($_SESSION[user_id])){
$username=mysql_real_escape_string($_COOKIE['userlogin']);
$loginhash=mysql_real_escape_string($_COOKIE['loginhash']);
$result=mysql_query("select * from members where (username='$username' || email='$username') && loginhash='$loginhash' ") or die (mysql_error());
$row=mysql_fetch_array($result);
$_SESSION['username']=$row[username];
$_SESSION['user_id']=$row['id'];
}
然后,当然,在用户手动注销时取消设置 cookie。
我的问题是,这样做是否安全(除了其他人使用用户计算机的危险)?每次登录都会生成随机哈希,因此某人不能仅使用某人的用户名创建 cookie 并以该人身份登录。
登录脚本在 HTTPS 上,因此这方面没有危险。