一个简单安全的PHP验证码类、PHP验证码


Posted in PHP onSeptember 24, 2016

一,验证码示例

一个简单安全的PHP验证码类、PHP验证码

二,php验证码类,secoder.class.php

<?php 
/** 
* 安全验证码 
* 
* 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码 
* 
* @author 流水孟春 <cmpan(at)qq.com> 
* @link http://labs.yulans.cn/YL_Security_Secoder 
* @link http://wiki.yulans.cn/docs/yl/security/secoder 
*/ 
class YL_Security_Secoder { 
/** 
* 验证码的session的下标 
* 
* @var string 
*/ 
//public static $seKey = 'sid.sek ey.ylans.cn'; 
public static $seKey = 'sid'; 
public static $expire = 3000; // 验证码过期时间(s) 
/** 
* 验证码中使用的字符,01IO容易混淆,建议不用 
* 
* @var string 
*/ 
public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY'; 
public static $fontSize = 25; // 验证码字体大小(px) 
public static $useCurve = true; // 是否画混淆曲线 
public static $useNoise = true; // 是否添加杂点 
public static $imageH = 0; // 验证码图片宽 
public static $imageL = 0; // 验证码图片长 
public static $length = 4; // 验证码位数 
public static $bg = array(243, 251, 254); // 背景 
protected static $_image = null; // 验证码图片实例 
protected static $_color = null; // 验证码字体颜色 
/** 
* 输出验证码并把验证码的值保存的session中 
* 验证码保存到session的格式为: $_SESSION[self::$seKey] = array('code' => '验证码值', 'time' => '验证码创建时间'); 
*/ 
public static function entry() { 
// 图片宽(px) 
self::$imageL || self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5; 
// 图片高(px) 
self::$imageH || self::$imageH = self::$fontSize * 2; 
// 建立一幅 self::$imageL x self::$imageH 的图像 
self::$_image = imagecreate(self::$imageL, self::$imageH); 
// 设置背景 
imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]); 
// 验证码字体随机颜色 
self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120)); 
// 验证码使用随机字体 
//$ttf = dirname(__FILE__) . '/ttfs/' . mt_rand(1, 20) . '.ttf'; 4 
$ttf = dirname(__FILE__) . '/ttfs/4.ttf'; 
if (self::$useNoise) { 
// 绘杂点 
self::_writeNoise(); 
} 
if (self::$useCurve) { 
// 绘干扰线 
self::_writeCurve(); 
} 
// 绘验证码 
$code = array(); // 验证码 
$codeNX = 0; // 验证码第N个字符的左边距 
for ($i = 0; $i<self::$length; $i++) { 
$code[$i] = self::$codeSet[mt_rand(0, 27)]; 
$codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.6); 
// 写一个验证码字符 
imagettftext(self::$_image, self::$fontSize, mt_rand(-40, 70), $codeNX, self::$fontSize*1.5, self::$_color, $ttf, $code[$i]); 
} 
// 保存验证码 
isset($_SESSION) || session_start(); 
$_SESSION[self::$seKey]['code'] = join('', $code); // 把校验码保存到session 
$_SESSION[self::$seKey]['time'] = time(); // 验证码创建时间 
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"); 
// 输出图像 
imagepng(self::$_image); 
imagedestroy(self::$_image); 
} 
/** 
* 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数) 
* 
* 高中的数学公式咋都忘了涅,写出来 
* 正弦型函数解析式:y=Asin(ωx+φ)+b 
* 各常数值对函数图像的影响: 
* A:决定峰值(即纵向拉伸压缩的倍数) 
* b:表示波形在Y轴的位置关系或纵向移动距离(上加下减) 
* φ:决定波形与X轴位置关系或横向移动距离(左加右减) 
* ω:决定周期(最小正周期T=2π/?ω?) 
* 
*/ 
protected static function _writeCurve() { 
$A = mt_rand(1, self::$imageH/2); // 振幅 
$b = mt_rand(-self::$imageH/4, self::$imageH/4); // Y轴方向偏移量 
$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量 
$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期 
$w = (2* M_PI)/$T; 
$px1 = 0; // 曲线横坐标起始位置 
$px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667); // 曲线横坐标结束位置 
for ($px=$px1; $px<=$px2; $px=$px+ 0.9) { 
if ($w!=0) { 
$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b 
$i = (int) ((self::$fontSize - 6)/4); 
while ($i > 0) { 
imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 这里画像素点比imagettftext和imagestring性能要好很多 
$i--; 
} 
} 
} 
$A = mt_rand(1, self::$imageH/2); // 振幅 
$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量 
$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期 
$w = (2* M_PI)/$T; 
$b = $py - $A * sin($w*$px + $f) - self::$imageH/2; 
$px1 = $px2; 
$px2 = self::$imageL; 
for ($px=$px1; $px<=$px2; $px=$px+ 0.9) { 
if ($w!=0) { 
$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b 
$i = (int) ((self::$fontSize - 8)/4); 
while ($i > 0) { 
imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多 
$i--; 
} 
} 
} 
} 
/** 
* 画杂点 
* 往图片上写不同颜色的字母或数字 
*/ 
protected static function _writeNoise() { 
for($i = 0; $i < 10; $i++){ 
//杂点颜色 
$noiseColor = imagecolorallocate( 
self::$_image, 
mt_rand(150,225), 
mt_rand(150,225), 
mt_rand(150,225) 
); 
for($j = 0; $j < 5; $j++) { 
// 绘杂点 
imagestring( 
self::$_image, 
5, 
mt_rand(-10, self::$imageL), 
mt_rand(-10, self::$imageH), 
self::$codeSet[mt_rand(0, 27)], // 杂点文本为随机的字母或数字 
$noiseColor 
); 
} 
} 
} 
/** 
* 验证验证码是否正确 
* 
* @param string $code 用户验证码 
* @param bool 用户验证码是否正确 
*/ 
public static function check($code) { 
isset($_SESSION) || session_start(); 
// 验证码不能为空 
if(empty($code) || empty($_SESSION[self::$seKey])) { 
//echo $_SESSION[self::$seKey]['code'].'1'; 
return false; 
} 
// session 过期 
if(time() - $_SESSION[self::$seKey]['time'] > self::$expire) { 
unset($_SESSION[self::$seKey]); 
//echo $_SESSION[self::$seKey]['code'].'2'; 
return false; 
//return 0; 
} 
// if($code == $_SESSION[self::$seKey]['code']) { 
if(strtoupper($code) == $_SESSION[self::$seKey]['code']) { //不区分大小写比较 
//echo $_SESSION[self::$seKey]['code'].'3'; 
return true; 
} 
//echo $_SESSION[self::$seKey]['code'].'4'; 
return false; 
} 
} 
// useage 
/* 
YL_Security_Secoder::$useNoise = false; // 要更安全的话改成true 
YL_Security_Secoder::$useCurve = true; 
YL_Security_Secoder::entry(); 
*/ 
/* 
// 验证验证码 
if (!YL_Security_Secoder::check(@$_POST['secode'])) { 
print 'error secode'; 
} 
*/

三,调用方法

1,显示验证码页面code.php

<?php 
session_start(); 
require 'secoder.class.php'; //先把类包含进来,实际路径根据实际情况进行修改。 
$vcode = new YL_Security_Secoder(); //实例化一个对象 
$vcode->entry(); 
?>

2,检查验证码是否正确

<?php 
session_start(); 
require 'secoder.class.php'; //先把类包含进来,实际路径根据实际情况进行修改。 
$vcode = new YL_Security_Secoder(); //实例化一个对象 
//$vcode->entry(); 
$code = $_GET['code']; 
echo $vcode->check($code); 
//$_SESSION['code'] = $vc->getCode();//验证码保存到SESSION中 
?>

3,验证码输入框调用页面

<img id="messageImg" src='images/tishis2.gif' width='16' height='16'> 单击图片重新获取验证码<br> 
<a href="#"><img src="code.php" onclick="javascript:this.src='code.php?tm='+Math.random();" />

以上所述是小编给大家介绍的一个简单安全的PHP验证码类、PHP验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
?算你??的 PHP 程式大小
Dec 06 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
PHP解决中文乱码
Apr 28 PHP
php实现等比例压缩图片
Jul 26 PHP
php代码调试利器firephp安装与使用方法分析
Aug 21 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 #PHP
php getcwd与dirname(__FILE__)区别详解
Sep 24 #PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 #PHP
mysql alter table命令修改表结构实例详解
Sep 24 #PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 #PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 #PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 #PHP
You might like
php 注释规范
2012/03/29 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
python对数组进行反转的方法
2015/05/20 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python有序字典简单实现方法示例
2017/09/28 Python
python中列表和元组的区别
2017/12/18 Python
python使用多进程的实例详解
2018/09/19 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
python全栈开发语法总结
2020/11/22 Python
python脚本定时发送邮件
2020/12/22 Python
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
秋季运动会稿件
2014/01/30 职场文书
公民授权委托书范本
2014/09/17 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
学生检讨书怎么写
2015/05/07 职场文书
严以律己学习心得体会
2016/01/13 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python