ThinkPHP---TP功能类之验证码
【一】验证码
验证码全称:captcha(全自动识别机器与人类的图灵测试),简单理解就是区分当前操作是人执行的还是机器执行的
常见验证码分3种:页面上图片形式、短信验证码(邮箱验证可以归类到短信验证码,只是载体不同。一个短信一个邮件)、语音验证码(点击后给手机打电话,机器读两遍验证码)。
注意:现在流行的刷脸是验证形式,不是验证码
(1)图片验证码
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印。
gd操作流程:①画布;②画干扰线、干扰点、生成验证码随机数画上去;③保存到session里;④输出图片
(2)验证码封装函数
在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. 除了以上几个方法(配置、校验、输出),其他方法(例如加密验证码、绘制背景图、画杂点等)均为私密方法,不对外开放
(3)生成验证码
包含常规验证码和中文验证码
1. 常规验证码
由数字和大小写字母组成的验证码
注意:①验证码黑屏问题:输出前头部有Bom;②验证码字体控制一般用字体表4.ttf;
//生成常规验证码
public function yzm(){
ob_clean();
$array = array(
'fontSize' => 12, // 验证码字体大小(px)
'useCurve' => false, // 是否画混淆曲线
'useNoise' => false, // 是否添加杂点
'length' => 4, // 验证码位数
'fontttf' => '4.ttf', // 验证码字体,不设置随机获取
);
//1.实例化验证码类,两个方式①引入父类验证码use Think\Verify,写在namespace后;②行内形式\Think\Verify();
$verify = new \Think\Verify($array);
//2.输出验证码,之前说过对外有三个方法配置、校验、输出保存,这里应该调用输出方法
$verify->entry();
}
2. 中文验证码
注意:字体文件夹Verify下的中文字体文件夹zhttfs初始化时为空,所以无法和常规验证码一样直接使用。
字体文件可以在本地找到,控制面板---切换到大图标,找到字体--列出本地全部字体---复制黑体常规(中文即可)到中文文件夹zhttfs下。
//生成中文验证码
public function yzm(){
ob_clean();//去除Bom(编辑器加的UTF-8标签)
//配置
$cfg = array(
'useZh' => true, // 使用中文验证码
'fontSize' => 20, // 验证码字体大小(px)
'useCurve' => false, // 是否画混淆曲线
'useNoise' => false, // 是否添加杂点
'length' => 4, // 验证码位数
'fontttf' => '', // 验证码字体,不设置随机获取
);
//实例化验证码类
$Verify = new \Think\Verify($cfg);
//输出保存验证码图片
$Verify->entry();
}
补充说明:
①关于中文验证码:实际开发时,避免使用中文验证码(考虑外企合作);
②需要中文字体的支持,中文字体可以在本地找到或者网上下载复制到中文的文件夹下;
③使用中文验证码必须开启php_mbstring扩展(该扩展项在php.ini里,去掉扩展前的封号;即可,开启后重启Apache)
ThinkPHP---TP功能类之验证码的更多相关文章
- thinkphp框架调用类不存在的方法
thinkphp框架调用类不存在的方法调用类不存在的方法,不会报错,但是也不会执行,这是根据tp框架里面的一个魔术方法,框架里面一共才十几个魔术方法
- thinkphp杂项功能(主干)
thinkphp杂项功能(主干) 一.总结 1.杂项功能:杂项里面我需要有点印象的是五个:缓存,多语言,图像处理,文件处理,单元测试 二.thinkphp杂项功能(主干) thinkphp扩展杂项功能 ...
- 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient
Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...
- php之框架增加日志记录功能类
<?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ // ...
- ThinkPHP登录功能的实现方法
登陆功能是PHP程序设计中常见的功能.本文ThinkPHP实例主要完成注册成功后进入首页,并告诉你是登录用户的功能.具体实现步骤如下: 第一步:在config.php文件中加上: 完整实现代码如下: ...
- php CI框架实现验证码功能和增强验证码安全性实战教程
php CI框架实现验证码功能和增强验证码安全性实战教程 CodeIgniter简称CI是最流行的一个php MVC框架之一,本人讲从实际项目使用中写系列实战经验,有别与其他的理论讲解文章,会附上实战 ...
- thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)
thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证) Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...
- php之ThinkPHP的memcached类的修改
php之ThinkPHP的memcached类的修改 在Think\Cache\Driver\Memcached.class.php中,增加方法获取错误信息的方法,方便调试, public funct ...
- 为什么我在css里使用功能类优先
前言 我想在我们开始的学CSS语法的时候,都是从以下的流程开始的: 1.写一个CSS类选择器: .my-class { } 2.往选择器里填充CSS语法: .my-class { display fl ...
随机推荐
- linux 打包 压缩
序 1.gzip 2.bzip2 3.tar 序 压缩优点 1.节省空间 2.节省带宽 解决脉络 如今有各种压缩文件形式,原因何在?主要是压缩技术更新换代,压缩方法不全然同样.不同的后缀 ...
- web 页面传值乱码问题
今天碰到一个问题,将A页面中文值传到B页面,session保存,然后在C页面显示,页面显示乱码 百度了一下什么原因,以为是session保存中乱码,于是将B页面的通过Server.UrlDecode( ...
- Ural1099 Work Scheduling 一般图的最大匹配
Ural1099 给定无向图, 求最大匹配. 在寻找增广路的过程中,可能出现一个奇环,这时候把奇环收缩,成为一朵“花”,并在新图上继续增广. 为了记录匹配关系,需要在花中寻找路径,每一条增广路径都可以 ...
- Oracle强杀进程
1.找到sid,serial#: SELECT /*+ rule */ s.username, l.type, decode(l.type,'TM','TABLE LOCK', ...
- 为npm设置代理,解决网络问题
为npm设置代理,解决网络问题 npm config set proxy=http://127.0.0.1:1080
- NestedPreb
屌丝手动版 One of the things we’re sorely missing from Unity is nested prefabs. So we rolled this little ...
- 我的周记2——“天道酬勤"
Get 什么是JAVA https://zhuanlan.zhihu.com/p/62717204 了解下HTTP 缓存机制 https://juejin.im/post/5a1d4e546fb9a ...
- git分支的理解
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- gitlab&Jenkins 详细介绍及其应用
第1章 gitlab 1.1 系统环境 [root@jenkins ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...