您的位置:首页 > 编程语言 > PHP开发

一个PHP验证码类与实例

2013-12-27 07:11 477 查看
这是个php 验证码类,我现在设置的大小是90*30的,可以根据需要具体修改,不过,修改了图片大小以后,需要根据情况具体修改些。

1,代码调用:

// 绘验证码
$code = array(); // 验证码
$codeNX =-20; // 验证码第N个字符的左边距,如果图片大小变化,需要修改
for ($i = 0; $i<self::$length; $i++) {
$code[$i] = self::$codeSet[mt_rand(0, 27)];
$codeNX += mt_rand(self::$fontSize, self::$fontSize);
// 写一个验证码字符,具体修改看这个函数的功能
imagettftext(self::$_image, self::$fontSize*0.65, mt_rand(-40, 40), $codeNX, self::$fontSize, self::Getcolor(), $ttf, $code[$i]);
//imagettftext()中self::$fontSize大小修改,改变字母上下的幅度,具体可以这样self::$fontSize*0.9,
}
<?php
/**
* 安全验证码
* 整理:www.jbxue.com
* 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码
*
*/
class Authcode {
/**
* 验证码的session的下标
*
* @var string
*/
public static $seKey = 'authcode';
public static $expire = 3000;     // 验证码过期时间(s)
/**
* 验证码中使用的字符,01IO容易混淆,建议不用
*
* @var string
*/
public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
public static $fontSize = 20;     // 验证码字体大小(px)
public static $useCurve = true;   // 是否画混淆曲线
public static $useNoise = true;   // 是否添加杂点
public static $imageH = 25;        // 验证码图片宽
public static $imageW = 75;        // 验证码图片长
public static $length = 4;        // 验证码位数
public static $font = 1;          //选择字体

protected static $_image = null;     // 验证码图片实例
protected static $_color = null;     // 验证码字体颜色

/**
* 验证码字体颜色,可以设定为固定,也可以随机,可以所有为一个颜色也可以每个字符为一个颜色
*
*/
public static function Getcolor(){

$fontcolor = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));
return $fontcolor;

}
/*
* 可以根据自己需要来添加或者减少,也可以指定单一的背景颜色
*/
public static function Background(){
$color = array(
array(240,255,255),
array(245,245,245),
array(255,248,220),
array(252,230,201),
array(240,255,240),
array(250,255,240),
array(250,240,230),
array(255,245,238),
array(255,250,250)
);
$m = rand(0,5);
imagecolorallocate(self::$_image, $color[$m][0], $color[$m][1], $color[$m][2]);
}
/**
* 输出验证码并把验证码的值保存的session中
* 验证码保存到session的格式为: $_SESSION[self::$seKey] = array('code' => '验证码值', 'time' => '验证码创建时间');
*/
public static function Build() {
// 图片宽(px)
self::$imageW || self::$imageW = self::$length * self::$fontSize  + self::$fontSize;
// 图片高(px)
self::$imageH || self::$imageH = self::$fontSize * 3;
// 建立一幅 self::$imageW x self::$imageH 的图像
self::$_image = imagecreate(self::$imageW, self::$imageH);

// 设置背景
self::Background();

// 验证码使用字体
$ttf = 'style/images/' . self::$font . '.ttf';
if (self::$useNoise) {
// 绘杂点
self::writeNoise();
}

// 绘验证码
$code = array(); // 验证码
$codeNX =-20; // 验证码第N个字符的左边距
for ($i = 0; $i<self::$length; $i++) {
$code[$i] = self::$codeSet[mt_rand(0, 27)];
$codeNX += mt_rand(self::$fontSize, self::$fontSize);
// 写一个验证码字符,具体修改看这个函数的功能
imagettftext(self::$_image, self::$fontSize*0.6, mt_rand(-40, 40), $codeNX, self::$fontSize*0.9, self::Getcolor(), $ttf, $code[$i]);
}

// 保存验证码
//      isset($_SESSION) || session_start();
$_SESSION[self::$seKey] = join('', $code); // 把校验码保存到session
$_SESSION['out_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);
}
/**
* 画杂点
* 往图片上写不同颜色的字母或数字
*/
protected static function writeNoise() {
for($i = 0; $i < 5; $i++){
//杂点颜色
$noiseColor = imagecolorallocate(
self::$_image,
mt_rand(100,200),
mt_rand(100,200),
mt_rand(100,200)
);
for($j = 0; $j < 3; $j++) {
// 绘杂点($j<? 来调整杂点个数)
imagestring(
self::$_image,
3, //背景字体的大小
mt_rand(-5, self::$imageW),
mt_rand(-5, self::$imageH),
self::$codeSet[mt_rand(1, 27)], // 杂点文本为随机的字母或数字
$noiseColor
);
}
}
}
/**
* 验证验证码是否正确
*
* @param string $code 用户验证码
* @param bool 用户验证码是否正确
*/
public static function check($code) {
$code = strtoupper($code);
// 验证码不能为空
if(emptyempty($code) || emptyempty($_SESSION[self::$seKey])) {
return false;
}
// session 过期
if(time() - $_SESSION['out_time'] > self::$expire) {
unset($_SESSION[self::$seKey]);
return false;
}
if($code == $_SESSION[self::$seKey]) {
return true;
}

return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: