全面解析PHP验证码的实现原理 附php验证码小案例

前端之家收集整理的这篇文章主要介绍了全面解析PHP验证码的实现原理 附php验证码小案例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

拓展

我们需要开启gd拓展,可以使用下面的代码来查看是否开启gd拓展。

PHP;"> echo "Hello World!!!!";

echo phpinfo();
?>

然后在浏览器上Ctrl+F查找gd选项即可验证自己有没有装这个拓展,如果没有的话,还需要自己全装一下这个拓展。

背景图

imagecreatetruecolor

默认生成黑色背景

PHP;"> PHP // 使用gd的imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30); // 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png');

imagepng($image);

// 释放资源,销毁执行对象
imagedestroy($image);

imagecolorallocate

创建一个填充色,并用imagefill(image,x,y,color)方法来附着。

PHP;"> PHP // 使用gd的imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);

// 生成填充色
$bgcolor = imagecolorallocate($image,255,255);
// 将填充色填充到背景图上
imagefill($image,$bgcolor);
// 在显示这张图片的时候一定要先声明头信息
header('content-type:image/png');

imagepng($image);

// 释放资源,销毁执行对象
imagedestroy($image);

imagepng

在使用这个方法之前,一定要先设置头信息,否则不会正常的显示图片

imagedestory(image)

适时的释放资源会减轻对服务器请求的压力。

简易数字验证码

imagecolorallocate

生成颜色信息,方便待会的赋予处理。

imagestring

内容信息写到图片的相应位置上。

增加识别干扰

PHP;"> //增加

// 生成一些干扰的点,这里是200个
for($i=0;$i<200;$i++){
$pointcolor = imagecolorallocate($image,rand(50,255));
imagesetpixel($image,100),30),$pointcolor);
}

// 增加线

// 生成一些干扰线 这里是5个
for($i=0;$i<5;$i++){
// 设置为浅色的线,防止喧宾夺主
$linecolor = imagecolorallocate($image,255));
imageline($image,99),29),$linecolor);

}

数字字母混合验证码

PHP;"> PHP // 使用gd的imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,40);

// 生成填充色
$bgcolor = imagecolorallocate($image,$bgcolor);

//////// 生成随机4位字母以及数字混合的验证码
for($i=0;$i<4;$i++){
$fontsize = rand(6,8);
$fontcolor = imagecolorallocate($image,255));
// 为了避免用户难于辨认,去掉了某些有歧义的字母和数字
$rawstr = 'abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ';
$fontcontent = substr($rawstr,strlen($rawstr)),1);
// 避免生成图片重叠
$x += 20;
$y = rand(10,20);
imagestring($image,$fontcolor);
}

// 生成一些干扰的点,这里是200个
for($i=0;$i<200;$i++){
$pointcolor = imagecolorallocate($image,$pointcolor);
}
// 生成一些干扰线 这里是4个
for($i=0;$i<4;$i++){
// 设置为浅色的线,防止喧宾夺主
$linecolor = imagecolorallocate($image,$linecolor);

}

header('content-type:image/png');

imagepng($image);

// 释放资源,销毁执行对象
imagedestroy($image);

使用验证码

开启session的时机

注意: 开启session一定要在开始的地方

验证的原理

验证的过程就是客户端输入的验证码和存在于session域中的验证码进行对比。即:

PHP;"> if(isset($_REQUEST['checkcode'])){ session_start(); if($_REQUEST['checkcode']==$_SESSION['checkcode']){ echo "Success!"; }else{ echo "Failed!"; } exit(); }

优化验证

但是简单的这样验证有一点不好的地方,那就是字母的大小写容易出错。所以我们要做一下转换,将用户输入的数值全部变成小写的。

小案例

生成验证码

PHP;"> PHP session_start();// 必须在PHP的最开始部分声明,来开启session

// 使用gd的imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,$bgcolor);

//////// 生成随机4位字母以及数字混合的验证码
$checkcode='';
for($i=0;$i<4;$i++){
$fontsize = rand(6,255));
// 为了避免用户难于辨认,去掉了某些有歧义的字母和数字
$rawstr = 'abcdefghjkmnopqrstuvwxyz23456789';
$fontcontent = substr($rawstr,1);
// 拼接即将诞生的验证码
$checkcode.=$fontcontent;
// 避免生成图片重叠
$x += 20;
$y = rand(10,$fontcolor);
}
// 保存到session变量中
$_SESSION['checkcode']=$checkcode;

// 生成一些干扰的点,这里是200个
for($i=0;$i<200;$i++){
$pointcolor = imagecolorallocate($image,$linecolor);

}

header('content-type:image/png');

imagepng($image);

// 释放资源,销毁执行对象
imagedestroy($image);

表单验证

PHP;"> PHP header("Content-Type:text/html;charset=utf8"); if(isset($_REQUEST['checkcode'])){ session_start(); if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){ echo "Success!"; }else{ echo "Failed!"; } exit(); } ?> 验证验证码信息
PHP" method="post">

验证码图片:

PHP?r=" />
请输入验证码

@H_
301_143@

总结

最后,来个总结吧。 •使用PHP制作验证码需要gd拓展的支持。 •使用imagecreatetruecolor方法生成背景色,并用imagefill填充一个由imagecolorallocate产生的颜色。 •使用imagestring来实现验证码和背景图的结合 •使用imagesetpixel来添加干扰点 •使用imageline来添加干扰线 •使用session之前要在开头开启session_start()方法 •使用JavaScript来动态的修改验证码的src,来满足用户“换一张”的需求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

猜你在找的PHP相关文章