PHP改session为cookies,实现记住密码永久登录的方法
2020-08-04 admin php 1413
一般web程序使用session来保持登录,session是记录在服务器上的,所以关闭网页,或长时间不操作,就需要重新登录。
因有客户需要使用记住密码功能,而且对安全性并不很重视,为了适应原程序尽量少改动,使用了cookies替代session记住密码,在修改过程中要注意以下几点:
首先要解决,如何使用cookies保存数组。因原来session是保存用户数据数组,而cookie只能保存字符串,因此,需用下面的方法保存数组:
$group = $is_true['用户组']; if(session_status() == 1){session_start();} $_SESSION['userinfo'] = ['username' => $username,'group' => $group]; setcookie("userinfo[username]", $username, time()+3600000,'/'); setcookie("userinfo[group]", $group, time()+3600000,'/');
其次,在保存cookie时,一定要指定根目录为路径,否则会出现跳转页面cookie消失的问题。比如上面例子中的/就是根目录。cookie的失效时间,可根据需要设置,单位为秒,比如上面代码中设置为一个月。
第三,在退出登录时,需要清除session的同时,删除cookie。删除cookie有两种方法,一种是设置失效时间为目前时间-1,另一种是直接清除变量,方法如下:
if(isset($_GET['action'])){//注销登录 if($_GET['action'] == "logout"){ if(session_status() == 1){session_start();} session_unset(); session_destroy();//清除服务器的sesion文件 if(isset($_COOKIE['userinfo'])){ setcookie("userinfo[username]", null, time()-1,'/');//清理cookie setcookie("userinfo[group]", null, time()-1,'/'); } exit; } }
这里需要强调的是,清除cookie也一定要指定目录为根目录,并且,如果是数组,一定要将数组成员一个一个清除,不能直接清除数组,因为cookie不支持数组,直接清理数组是无效的。
判断登录可用如下方法:
//判断用户是否登录及登录类型 public function is_login() { if(empty($_COOKIE["userinfo"])){ return '未登录';//未登录 }else{ return $_COOKIE['userinfo']['group'];//返回用户组 } }
这种方法安全上有很大问题,因为cookie没有加密,所以用户容易伪造。比较可行的方法是,将用户名等信息和到期时间,用md5等加密后,保存在数据库用户信息中。打开首页时,读取用户cookie加密数据并和数据库中的比对,确定是否登录。