首页 > php教程 > php手册 > 正文

PHP验证码处理源代码

php中文网
发布: 2016-06-06 19:40:41
原创
1487人浏览过

?php /** * 安全的 验证 码要: 验证 码文字扭曲、旋转,使用不同字体,添加干扰码。 * @原作者: 流水孟春 cmpan@qq.com * @修 改: flymorn www.piaoyi.org **/ class YL_Security_Secoder { // 验证 码的session的下标 public static $seKey = 'verify_py

/**
* 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码。
* @原作者: 流水孟春
* @修 改: flymorn
**/
class yl_security_secoder {
//验证码的session的下标
public static $sekey = 'verify_py'; //验证码关键字
public static $expire = 3000; // 验证码过期时间(s)
//验证码中使用的字符,01io容易混淆,不用
public static $codeset = '3456789abcdefghjklmnpqrtuvwxy';
public static $fontsize = 26; // 验证码字体大小(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中
*/
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/t' . mt_rand(1, 10) . '.ttf';

if (self::$usenoise) {
// 绘杂点
self::_writenoise();
}
if (self::$usecurve) {
// 绘干扰线
self::_writecurve();
}

// 绘验证
$code = array(); // 验证
$codenx = 0; // 验证码第n个字符的左边距
for ($i = 0; $i<:> $code[$i] = self::$codeset[mt_rand(0, 28)];
$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('pragma: no-cache');
header("content-type: image/jpeg");

// 输出图像
imagejpeg(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 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 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 //杂点颜色
$noisecolor = imagecolorallocate(
self::$_image,
mt_rand(150,225),
mt_rand(150,225),
mt_rand(150,225)
);
for($j = 0; $j // 绘杂点
imagestring(
self::$_image,
5,
mt_rand(-10, self::$imagel),
mt_rand(-10, self::$imageh),
self::$codeset[mt_rand(0, 28)], // 杂点文本为随机的字母或数字
$noisecolor
);
}
}
}
}

//调用上面定义的验证码类 来生产验证
YL_Security_Secoder::$useNoise = true; //是否启用噪点
YL_Security_Secoder::$useCurve = true; //是否启用干扰曲线
YL_Security_Secoder::entry();

?>

 

千博企业网站系统全功能个人版SQL2011 Build 0903
千博企业网站系统全功能个人版SQL2011 Build 0903

2010.09.03更新优化前台内核处理代码;优化后台内核、静态生成相关代码,生成速度全面提升;修改前台静态模板中所有已知错误;修正后台相关模块所有已知错误;更换后台编辑器,功能更强大;增加系统说明书。免费下载、免费使用、完全无限制。完全免费拥有:应广大用户要求,千博网络全面超值发布企业网站系统个人版程序包:内含Flash动画源码、Access数据库程序包、SQL数据库程序包。全站模块化操作,静态

千博企业网站系统全功能个人版SQL2011 Build 0903 0
查看详情 千博企业网站系统全功能个人版SQL2011 Build 0903

还有一个tts的文件夹用于放字体文件

立即学习PHP免费学习笔记(深入)”;

相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号