tp5使用cookie加密算法,以登录为例

首先,我们为什么要对cookie加密?

之所以要对cookie加密是以为cookie是保存在客户端的,稍微懂一点技术的人都能找到cookie的保存位置,如果我们保存cookie的时候没有加密,而是明文保存的话也就是说我们的用户名和密码就完全暴露了,这是一个非常大的安全隐患,所以必须加密cookie。

其次,我们不管要对cookie加密,还要考虑到当我们使用的时候要对加密后的cookie进行解密处理,得到正确的用户名和密码后才能做自动登录一类的功能,下面看看我们的加密方案:

1:在配置文件config中添加

'encryption_key'         =>'d441d33a65d31dbf0a8016a85c71a5b3',

2:在common文件中添加

//type  0:加密  1:解密
function encryption($value,$type=0){
   $key=config('encryption_key');
   if($type == 0){//加密
      return str_replace('=', '', base64_encode($value ^ $key));
   }else{
      $value=base64_decode($value);
      return $value ^ $key;
   }
}

 3:在模型中加密代码

 public function login($data,$type=0){
        $userData=array();
        $userData['username']=trim($data['username']);
        $userData['password']=md5($data['password']);
        //验证用户名或邮箱或手机号是否存在
        $users=db('user')->where(array('username'=>$userData['username']))->whereOr(array('email'=>$userData['username']))->whereOr(array('mobile_phone'=>$userData['username']))->find();
        // dump($users); die;
        if($users){
            if($users['password'] == $userData['password']){
                session('uid',$users['id']);
                session('username',$users['username']);
                //写入会员等级及折扣率
                $points=$users['points'];
                $memberLevel=db('member_level')->where('bom_point','<=',$points)->where('top_point','>=',$points)->find();
                session('level_id',$memberLevel['id']);//等级id
                session('level_rate',$memberLevel['rate']);//等级折扣率
                //写入cookie
                if(isset($data['remember'])){
                    $aMonth=30*24*60*60;
                    $username=encryption($users['username'],0);
                    $password=encryption($data['password'],0);
                    cookie('username', $username, $aMonth, '/');
                    cookie('password', $password, $aMonth, '/');
                }
                $arr=[
                    'error'=>0,
                    'message'=>"",
                ];
                if($type == 1){
                    return $arr;
                }else{
                    return json($arr);
                }
            }else{
               $arr=[
                'error'=>1,
                'message'=>"<i class='iconfont icon-minus-sign'></i>用户名或者密码错误",
                'url'=>'',
                ];
                if($type == 1){
                    return $arr;
                }else{
                    return json($arr);
                }
            }
        }else{
            $arr=[
            'error'=>1,
            'message'=>"<i class='iconfont icon-minus-sign'></i>用户名或者密码错误",
            'url'=>'',
            ];
            if($type == 1){
                return $arr;
            }else{
                return json($arr);
            }
        }
    }

4:在控制器中解密代码

 public function checkLogin(){
        $uid=session('uid');
        if($uid){
            $arr['error']=0;
            $arr['uid']=$uid;
            $arr['username']=session('username');
            return json($arr);
        }else{
            if(cookie('username') && cookie('password')){
                $data['username']=encryption(cookie('username'),1);
                $data['password']=encryption(cookie('password'),1);
                $loginRes=model('user')->login($data,1);
                if($loginRes['error'] == 0){
                    $arr['error']=0;
                    $arr['uid']=$uid;
                    $arr['username']=session('username');
                    return json($arr);
                }
            }
            $arr=array();
            $arr['error']=1;
            return json($arr);
        }
    }

猜你喜欢

转载自blog.csdn.net/pan_yuyuan/article/details/81875917