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 ...
随机推荐
- Project Euler problem 68
题意须要注意的一点就是, 序列是从外层最小的那个位置顺时针转一圈得来的.而且要求10在内圈 所以,这题暴力的话,假定最上面那个点一定是第一个点,算下和更新下即可. #include <iostr ...
- Brackets常用插件
Emmet插件:https://github.com/emmetio/brackets-emmet AngularJS插件:https://github.com/angular-ui/AngularJ ...
- ios25---图片拉伸
控制器: // // ViewController.m // 12-图片的拉伸问题 // // Created by xiaomage on 15/12/30. // Copyright © 2015 ...
- 【USACO07FEB】 Cow Relays
[题目链接] 点击打开链接 [算法] 朴素算法,就是跑N-1遍floyd 而满分算法就是通过矩阵快速幂加速这个过程 [代码] ...
- 洛谷 P2577 [ ZJOI 2005 ] 午餐 —— DP + 贪心
题目:https://www.luogu.org/problemnew/show/P2577 首先,想一想可以发现贪心策略是把吃饭时间长的人放在前面: 设 f[i][j] 表示考虑到第 i 个人,目前 ...
- bzoj4264
哈希 cf原题...没见过的话真想不出来 将邻接表排序哈希,判断是否相同,但是会漏掉两点相邻的情况,于是再把自己加入自己的邻接表,然后再哈希判断. #include<bits/stdc++.h& ...
- ubuntu16.04 查看系统可用内存
free -m 查看内存情况 (单位MB) mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存. buffers和cach ...
- Extjs grid禁用头部点击三角下拉菜单
表格头部的三角在点击的时候禁止出现下拉菜单,给每一列添加属性menuDisabled:true xtype:'grid', enableColumnResize:false, columns:[ {t ...
- mysql left join 出现的结果会重复
left join 基本用法 MySQL left join 语句格式 A LEFT JOIN B ON 条件表达式 left join 是以A表为基础,A表即左表,B表即右表. 左表(A)的记录会全 ...
- redis 缓存应用
第1章 部署与安装 wget http://download.redis.io/releases/redis-3.2.10.tar.gz tar xf redis-3.2.10.tar.gz cd r ...