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

本文探讨了为何需要对Cookie进行加密,主要因为Cookie存储在客户端,未加密的Cookie可能导致用户名和密码暴露。文章介绍了在ThinkPHP5(TP5)框架下设置Cookie加密的步骤,包括在配置文件中添加加密配置,在公共文件中实现加密解密函数,以及在模型和控制器中的应用,以确保在自动登录等场景下能正确解密并使用Cookie数据。
摘要由CSDN通过智能技术生成

首先,我们为什么要对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);
        }
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值