本文实例讲述了tp5框架使用cookie加密算法实现登录功能。分享给大家供大家参考,具体如下:
首先,我们为什么要对cookie加密?
之所以要对cookie加密是以为cookie是保存在客户端的,稍微懂一点技术的人都能找到cookie的保存位置,如果我们保存cookie的时候没有加密,而是明文保存的话也就是说我们的用户名和密码就完全暴露了,这是一个非常大的安全隐患,所以必须加密cookie。
其次,我们不管要对cookie加密,还要考虑到当我们使用的时候要对加密后的cookie进行解密处理,得到正确的用户名和密码后才能做自动登录一类的功能,下面看看我们的加密方案:
1:在配置文件config中添加
1
|
'encryption_key' => 'd441d33a65d31dbf0a8016a85c71a5b3' , |
2:在common文件中添加
1
2
3
4
5
6
7
8
9
10
|
//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:在模型中加密代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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:在控制器中解密代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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 ); } } |
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/pan_yuyuan/article/details/81875917