php用户注册登录系统之验证码制作

验证码的分析

登录注册页面设置验证码主要是为了防止暴力破解、恶意注册等情况的发生,是属于网站的标配内容,到今天已经发展成将验证码直接发送到用户手机或者邮箱进行验证,本节只做最简单的图片验证码的验证,大家可以通过本节,了解验证码验证的原理


生成验证码的简单流程图

生成验证码的流程图.png

具体的实现见下面的内容


生成验证码背景图

1.开启php的GD扩展

打开php.ini文件,将extension=php_gd2.dll这一项的注释去掉,开启它,如果本来是开启的则不需要改动

p1.png

接下来,我们来制作一个60X15的白色背景图片

2.创建画布

画布,一种资源型数据。可以操作的图像资源。

  • 创建新画布(新建)

ImageCreate(宽,高),创建基于调色板的画布。

imageCreateTrueColor(宽,高);创建真彩色的画布。

  • 基于图片创建画布(打开)

imageCreateFromJPEG(图片地址);

imageCreateFromPNG(图片地址);

imageCreateFromGIF(图片地址);

我们创建一个真彩色的画布:

$width=60;
$height=15;
//创建画布
$img=imageCreateTrueColor($width,$height);

大家可以尝试使用var_dump();将$img输出查看其类似是不是资源型

3.操作画布

分配颜色:如果需要在画布上使用某个颜色,应该先将颜色分配到画布上。

使用函数:

颜色标识 = imageColorAllocate(画布,R,G,B);

//分配颜色
$white = imageColorAllocate($img,0xff,0xff,0xff);

填充画布:将填充点,连续并且颜色相同的点进行填充(替换)

使用函数:

imageFill(画布, 填充位置x, 填充位置Y,颜色标识)完成

位置采用坐标进行管理:

原点:0,0,画布的左上角。

向右,x轴增加,向下Y轴增加。

//填充颜色到画布
imageFill($img,0,0,$white);

4.输出画布

将画布中处理好的图样信息,输出出来。

典型的:

  • 输出到图片文件。

  • 直接输出。

使用函数:

imagePNG(画布[, 文件地址])://在指定地址生成文件

imageJPEG();//在网页上直接输出,我们的验证码采用这种方式

imageGIF();//同上一个

如果没有第二个参数,表示直接输出。

直接输出到浏览器,需要告知浏览器,响应数据的类型应该是PNG格式的图片:

使用指令Content-type

//直接输出

header('Content-Type:image/jpeg;');

imageJPEG($img);

注:一个画布可以输出多次,输出为各种格式!

5.销毁画布资源

使用函数:imageDestroy();

imageDestroy($img);



生成验证码的值

1.首先必须定义所以可能出现的字符,获取所有字符的总长度以及我们要生成的验证码的长度

代码如下:

//生成验证码的值
$chars = '1234567890';//所以可能出现的字符
$chars_len=strlen($chars);
$code_len=4;//验证码的长度
$code='';//初始化验证码字符串

2.分四次,每次从所有可能出现的字符中取出一个数字,最后将四位数字链接在一起,生成验证码的值

for($i=1;$i<=$code_len;++$i){
    $rand=mt_rand(0,$chars_len-1);//随机取0-9中的任意一个数字
    $code.=$rand;//将取出来的数字连接在一起
}

3.开启session,将验证码值存入session中,用于验证

//存入session中,用于验证-------------------------
session_start();
$_SESSION[' ver_code']=$code;


将验证码值放入验证码背景图片中

1.给验证码值分配随机颜色

//随机分配字符串颜色
$str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));

2.使验证码值居中写在背景图上面

//计算字符串的居中
//字符串大小
$font=5;
//画布尺寸
$img_w=imageSX($img);
$img_h=imageSY($img);
//字体的尺寸
$font_w=imagefontwidth($font);
$font_h=imagefontheight($font);
//字符串的尺寸
$code_w=$font_w*$code_len;
$code_h=$font_h;
$x=($img_w-$code_w)/2;
$y=($img_h-$code_h)/2;
//把验证码输出到画布上----------------------------
imageString($img,$font,$x,$y,$code,$str_color);

3.输出验证码

//直接输出
imageJPEG($img);
imageDestroy($img);


完整代码如下

<?php
//生成验证码背景图---------------------------------
header('Content-Type:image/jpeg;');
//背景图尺寸
$width=60;
$height=15;
//创建画布
$img=imageCreateTrueColor($width,$height);
//分配颜色
$white = imageColorAllocate($img,0xff,0xff,0xff);
//填充颜色到画布
imageFill($img,0,0,$white);
//生成验证码的值----------------------------------
$chars = '1234567890';//所以可能出现的字符
$chars_len=strlen($chars);
$code_len=4;//验证码的长度
$code='';//初始化验证码字符串
for($i=1;$i<=$code_len;++$i){
    $rand=mt_rand(0,$chars_len-1);//随机取0-9中的任意一个数字
    $code.=$rand;//将取出来的数字连接在一起
}
//存入session中,用于验证-------------------------
session_start();
$_SESSION['ver_code']=$code;
//随机分配字符串颜色------------------------------
$str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//计算字符串的居中
//字符串大小
$font=5;
//画布尺寸
$img_w=imageSX($img);
$img_h=imageSY($img);
//字体的尺寸
$font_w=imagefontwidth($font);
$font_h=imagefontheight($font);
//字符串的尺寸
$code_w=$font_w*$code_len;
$code_h=$font_h;
$x=($img_w-$code_w)/2;
$y=($img_h-$code_h)/2;
//把验证码输出到画布上----------------------------
imageString($img,$font,$x,$y,$code,$str_color);
//直接输出
imageJPEG($img);
imageDestroy($img);
?>


继续学习
||
<?php //生成验证码背景图--------------------------------- header('Content-Type:image/jpeg;'); //背景图尺寸 $width=60; $height=15; //创建画布 $img=imageCreateTrueColor($width,$height); //分配颜色 $white = imageColorAllocate($img,0xff,0xff,0xff); //填充颜色到画布 imageFill($img,0,0,$white); //生成验证码的值---------------------------------- $chars = '1234567890';//所以可能出现的字符 $chars_len=strlen($chars); $code_len=4;//验证码的长度 $code='';//初始化验证码字符串 for($i=1;$i<=$code_len;++$i){ $rand=mt_rand(0,$chars_len-1);//随机取0-9中的任意一个数字 $code.=$rand;//将取出来的数字连接在一起 } //存入session中,用于验证------------------------- session_start(); $_SESSION['ver_code']=$code; //随机分配字符串颜色------------------------------ $str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //计算字符串的居中 //字符串大小 $font=5; //画布尺寸 $img_w=imageSX($img); $img_h=imageSY($img); //字体的尺寸 $font_w=imagefontwidth($font); $font_h=imagefontheight($font); //字符串的尺寸 $code_w=$font_w*$code_len; $code_h=$font_h; $x=($img_w-$code_w)/2; $y=($img_h-$code_h)/2; //把验证码输出到画布上---------------------------- imageString($img,$font,$x,$y,$code,$str_color); //直接输出 imageJPEG($img); imageDestroy($img); ?>
提交重置代码