作者LOVE2006 (^^)
看板PHP
标题[请益] 图片验证的问题
时间Thu Sep 20 22:56:07 2007
<?php
/**
* 利用 GD 动态生成登入验证的图片
*
* 鉴於每个GD版本出来的效果有一定的差别,请使用附件中的GD.dll,或者选用GD 2.0
以上的版本
*
* 目前该类库主要用於登入时生成附带验证码图片的功能,存储验证码有 Cookies 和
Session 两种,
* 生成的图片支援 PNG / JPG 等,还有可以设定验证码的长度,英文字元和数字混合等
。
*
* @作者 Hessian(
[email protected])
* @版本 1.0
* @版权所有 Hessian / NETiS
* @使用授权 GPL(请各位保留Comment)
* @特别鸣谢 waff(提供了非常特别输出方式)
* @开始 2003-11-05
* @浏览 公开
*
* 更新记录
*
* ver 1.0 2003-11-05
* 一个用於生成验证码图片的类库已经初步完成。
*
*/
class GenAuth
{
/**
* 判断是否使用 Session。
*
* @变量类型 布尔值
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 true / false
*/
var $UseSession = true;
/**
* 浏览 Session 的 Handle。
*
* @变量类型 字元串
* @开始 1.0
* @最後修改 1.0
* @浏览 内部
* @可选值 无
*/
var $_SessionNum = "";
/**
* 验证码的长度。
*
* @变量类型 数字
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 10进制的纯数字
*/
var $CodeLength = 8;
/**
* 生成的验证码是否带有英文字元。
*
* @变量类型 布尔值
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 true / false
*/
var $CodeWithChar = true;
/**
* 生成图片的类型。
*
* @变量类型 字元串
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 PNG / JPEG / WBMP / XBM
*/
var $ImageType = "PNG";
/**
* 生成图片的宽度。
*
* @变量类型 10进制数字
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 10进制的纯数字
*/
var $ImageWidth = 100;
/**
* 生成图片的高度。
*
* @变量类型 10进制数字
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 10进制的纯数字
*/
var $ImageHeight = 50;
/**
* 生成後的验证码。
*
* @变量类型 字元串
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 无
*/
var $AuthResult = "";
/**
* 图片中验证码的颜色。
*
* @变量类型 数组
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 顺序为 R,G,B, 例如:HTML颜色为 '000033' / array(0,0,51)
*/
var $FontColor = array(0, 0, 0);
/**
* 图片的背景色。
*
* @变量类型 数组
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 顺序为 R,G,B, 例如:HTML颜色为'000033' / array(0,0,51)
*/
var $BGColor = array(255, 255, 255);
/**
* 设定背景是否需要透明(注意:只有 PNG 格式支援,如果使用 JPG 格式的话,必须
禁止该选项)。
*
* @变量类型 布尔值
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 true / false
*/
var $Transparent = false;
/**
* 设定是否生成带噪点的背景。
*
* @变量类型 布尔值
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 true / false
*/
var $NoiseBG = true;
/**
* 设定生成噪点的字元。
*
* @变量类型 字元串
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 任意
*/
var $NoiseChar = "*";
/**
* 设定生成多少个噪点字元。
*
* @变量类型 10进制的纯数字
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 0 - 无限
*/
var $TotalNoiseChar = 50;
/**
* 验证码在图片中的左边距。
*
* @变量类型 10进制数字
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @可选值 10进制的纯数字,范围:0 - 100
*/
var $JpegQuality = 50;
/**
* GenAuth 的构造函数
*
* 详细说明
* @形参
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @返回值 无
* @throws
*/
function GenAuth()
{
} // 结束 GenAuth 的构造函数
/**
* 直接显示图片
*
* 详细说明
* @形参 字元串 $ImageType 设定显示图片的格式
* 10进制数字 $ImageWidth 设定显示图片的高度
* 10进制数字 $ImageHeight 设定显示图片的宽度
* @开始 1.0
* @最後修改 1.0
* @浏览 公开
* @返回值 无
* @throws
*/
function Show( $ImageType = "", $ImageWidth = "", $ImageHeight = "" )
{
// 生成验证码
if( $this->CodeWithChar )
for( $i = 0; $i < $this->CodeLength; $i++ )
$this->AuthResult .= dechex( rand( 1, 15 ) );
else
for( $i = 0; $i < $this->CodeLength; $i++ )
$this->AuthResult .= rand( 1, 9 );
// 检查有没有设定图片的输出格式,如果没有,则使用类库的预设值作为最终结果。
if ( $ImageType == "" )
$ImageType = $this->ImageType;
// 检查有没有设定图片的输出宽度,如果没有,则使用类库的预设值作为最终结果。
if ( $ImageWidth == "" )
$ImageWidth = $this->ImageWidth;
// 检查有没有设定图片的输出高度,如果没有,则使用类库的预设值作为最终结果。
if ( $ImageHeight == "" )
$ImageHeight = $this->ImageHeight;
// 建立图片流
$im = imagecreate( $ImageWidth, $ImageHeight );
// 取得背景色
list ($bgR, $bgG, $bgB) = $this->BGColor;
// 设定背景色
$background_color = imagecolorallocate( $im, $bgR, $bgG, $bgB );
// 取得文字颜色
list ($fgR, $fgG, $fgB) = $this->FontColor;
// 设定字型颜色
$font_color = imagecolorallocate( $im, $fgR, $fgG, $fgB );
// 检查是否需要将背景色透明
if ( $this->Transparent ) {
ImageColorTransparent( $im, $background_color );
}
if( $this->NoiseBG )
{
// ImageRectangle($im, 0, 0, $ImageHeight - 1, $ImageWidth - 1,
$background_color);//先成一黑色的矩形把图片包围
//下面该生成雪花背景了,其实就是在图片上生成一些符号
for ( $i = 1; $i <= $this->TotalNoiseChar; $i++ )
imageString( $im, 1, mt_rand( 1, $ImageWidth ), mt_rand( 1, $ImageHeight
), $this->NoiseChar, imageColorAllocate( $im, mt_rand( 200, 255 ), mt_rand(
200,255 ), mt_rand( 200,255 ) ) );
}
// 为了区别於背景,这里的颜色不超过200,上面的不小於200
for ( $i = 0; $i < strlen( $this->AuthResult ); $i++ ){
imageString( $im, mt_rand(3,5), $i*$ImageWidth/strlen( $this->AuthResult
)+mt_rand(1,5), mt_rand(1, $ImageHeight/2), $this->AuthResult[$i],
imageColorAllocate( $im, mt_rand(0, 100), mt_rand(0, 150), mt_rand(0, 200) )
);
}
// 检查输出格式
if ( $ImageType == "PNG" ) {
header( "Content-type: image/png" );
imagepng( $im );
}
// 检查输出格式
if ( $ImageType == "JPEG" ) {
header( "Content-type: image/jpeg" );
imagejpeg( $im, "", $this->JpegQuality );
}
// 释放图片流
imagedestroy( $im );
} // 结束 Show 函数
} // 结束类库
$AuthPic = new GenAuth();
$AuthPic->Show();
?>
这段程式最後会产生一个验证图片
要如何判断使用者的验证码输入正确?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.125.202.76
1F:嘘 kaijajan:去和$AuthPic->AuthResult是否相同,程式要看完 09/21 00:06
2F:→ kaijajan:都有中文注解了 09/21 00:06
3F:推 shadowjohn:我也是用他这支…但我改了好多XD...没改真的不会用... 09/21 10:47
4F:推 buganini:我用freecap, 蛮好用的 09/21 11:17