【一】验证码
验证码全称:captcha(全自动识别机器与人类的图灵测试),简单理解就是区分当前操作是人执行的还是机器执行的
常见验证码分3种:页面上图片形式、短信验证码(邮箱验证可以归类到短信验证码,只是载体不同。一个短信一个邮件)、语音验证码(点击后给手机打电话,机器读两遍验证码)。
注意:现在流行的刷脸是验证形式,不是验证码
(1)图片验证码
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印。
gd操作流程:①画布;②画干扰线、干扰点、生成验证码随机数画上去;③保存到session里;④输出图片
在ThinkPHP里系统封装了验证码类:Verify.class.php,文件位置ThinkPHP/Library/Think/Verify.class.php
//存储在session里的验证码不是明文存储的,而是md5加密格式的。 ???????//md5加密方式,不是之间加密,而是先连接seKey,截取其中多少位再md5加密:md5(123,seKey) ???????‘seKey‘ ????=> ?‘ThinkPHP.CN‘, ??// 验证码加密密钥
???????‘codeSet‘ => ‘2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY‘, // 验证码字符集合
???????‘expire‘ => 1800, // 验证码过期时间(s)
???????‘useZh‘ => false, // 使用中文验证码
???????‘zhSet‘ => ‘们以我到他会作时要动国产的......‘
???????‘useImgBg‘ => false, // 使用背景图片,默认不使用,因为自带的TP背景图有点丑...
???????‘fontSize‘ => 25, // 验证码字体大小(px),默认25px有点大哦...
???????‘useCurve‘ => true, // 是否画混淆曲线
???????‘useNoise‘ => true, // 是否添加杂点
???????‘imageH‘ => 0, // 验证码图片高度
???????‘imageW‘ => 0, // 验证码图片宽度
???????‘length‘ => 5, // 验证码位数,默认5,一般图片是4个,手机验证码6个
???????‘fontttf‘ => ‘‘, // 验证码字体,不设置则随机获取
???????‘bg‘ => array(243, 251, 254), // 背景颜色
???????‘reset‘ => true, // 验证成功后是否重置
①加密方式
具体加密流程在文件位置底部
/* 加密验证码 */ ???private function authcode($str){ ???????$key = substr(md5($this->seKey), 5, 8); ???????$str = substr(md5($str), 8, 10); ???????return md5($key . $str); ???}
这种二次加密的形式也叫加盐加密 / 加料加密,后期可能会用于数据表。
②验证码字符集
通过仔细观察验证码字符集可以发现少了许多字符,比如1,9l,g等。因为0和o,g和9等极其相似,所以为了避免频繁刷新验证码,减少服务器负担,所以将这些容易混淆的字符都去掉了
③验证码过期时间
因为验证码是存储在session中的,在规定的时间内若没有输入验证则会失效
④关于里面设置的字体、背景图,都在同级文件夹Verify中
⑤方法介绍
1. 构造方法:在实例化时可以传递一个数组,用于和其成员属性config合并,生成新配置
public function __construct($config=array()){ ???????$this->config ??= ??array_merge($this->config, $config); ???}
2. check方法:校验验证码,传递参数(用户输入的验证码)
/** ????* 验证验证码是否正确 ????* @access public ????* @param string $code 用户验证码 ????* @param string $id 验证码标识 ?????????* @return bool 用户验证码是否正确 ????*/ ???public function check($code, $id = ‘‘) { ???????$key = $this->authcode($this->seKey).$id; ???????// 验证码不能为空 ???????$secode = session($key); ???????if(empty($code) || empty($secode)) { ???????????return false; ???????} ???????// session 过期 ???????if(NOW_TIME - $secode[‘verify_time‘] > $this->expire) { ???????????session($key, null); ???????????return false; ???????} ???????if($this->authcode(strtoupper($code)) == $secode[‘verify_code‘]) { ???????????$this->reset && session($key, null); ???????????return true; ???????} ???????return false; ???}
3. entry方法:输出验证码图片,并保存到session。通过header头输出,输出格式png
header(‘Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate‘);header(‘Cache-Control: post-check=0, pre-check=0‘, false); ???????header(‘Pragma: no-cache‘);header("content-type: image/png");
4. 除了以上几个方法(配置、校验、输出),其他方法(例如加密验证码、绘制背景图、画杂点等)均为私密方法,不对外开放
视频学习笔录---ThinkPHP---TP功能类
原文地址:https://www.cnblogs.com/jianxian/p/8681618.html