在我们浏览操作网站时,经常会遇到各种各样的文字字符以及线条图案组成的验证码,那么这些文字组成的验证码是怎样生成的呢?
这里以php代码为例:
首先我们需要创建两个页面。一个为前端显示验证码的页面:
创建一个名称为yzm.php的空白页在其中写上:
<?php
session_start();
if(isset($_POST['yyz'])){
if($_POST["yyz"] == $_SESSION["yyz"]){
echo"验证码正确!";
}else{
echo"验证码错误";
}
}
?>
<form action="/" method="post">
<img src="yzm.php"/>
<input name="yyz type="text" "/>
<input type="submit" value="提交"/>
</form>
php部分用来接受提交的验证码,判断是否与阶段变量传递的验证码相同相同,通过相同则执行正确的操作,如果错误则显示验证错误提示.
然后分别创建一个img图片标签、input文本框、以及提交按钮.
其中form表单用来发送验证信息,在图片img标签地址中填入yzm.php动态地址,用来动态显示图片验证码,文本框用来输入看到的数字,提交按钮用来提交验证参数.
接下来就是创建用来显示动态图片的yzm.php文件了.
代码如下:
<?php
session_start();
$wenzi = "这是一段验证文字组合";
//获取字符的长度
$zifuchangdu = mb_strlen($wenzi,"UTF-8");
//将字符转为数组
$zifuyanzheng = array();
for( $i=0; $i<$zifuchangdu; $i++){
$zifuyanzheng[$i] = mb_substr($wenzi, $i,1,"UTF-8");
}
$huizhiwenzi = "";
// 图片上的文字
for($i=0; $i<3; $i++){
$suiji=rand(0, 1);
if($suiji==0){
$huizhiwenzi.=$zifuyanzheng[rand(0, $zifuchangdu-1)];
}else{
$huizhiwenzi.=dechex(rand(0,15));
}
}
$yzmimg = imagecreatetruecolor(130, 30);
$ztys = imagecolorallocate($yzmimg, 255,255,255);
imagettftext($yzmimg, 13, rand(2, 9), 20 ,20, $ztys, "字体名称.TTF",$huizhiwenzi);
$_SESSION["yyz"] = $huizhiwenzi;//传递阶段变量
$zft = imagecolorallocate($yzmimg, rand(0, 255),rand(0, 255),rand(0, 255));
//分配随机色
for($i=0; $i<180; $i++){
imagesetpixel($yzmimg, rand(1, 130), rand(1, 30), $zft);
}
for($i=0; $i<3; $i++){
imageline($yzmimg, 0, rand(0, 20), rand(70,130), rand(0, 20), $ztys);
}
header("Content-type:image/jpeg");
imagejpeg($yzmimg);
?>
这里我们主要用到了php中的GD图形库来生成动态图片.
GD图形库提供了全面的处理图片的API,我们只需要使用GD库就能够处理或生成图片,当然除了gd库php中还有功能更为强大的Imagick库或MagickWandForPHP函数来调用ImageMagick软件处理调整图片.
首先我们了解以下gd库中用到的一些函数信息:
imagesetpixel 绘制像素点
imageline 绘制线条
imagestring 绘制字符文字
imagecreatetruecolor为新建真彩色图像
imagecolorallocate 为图像分配颜色
imagejpeg 输出图片
大致的原理就是先创建一个用于验证的文字库,然后将文字库中的每个文字转出数组,通过rand函数提取出文字库中随机几个字符作为验证码的文字.
使用imagecreatetruecolor函数创建一个宽130高度为30px的图片,imagecolorallocate为其分配背景色
imagettftext在图片上写上字符,imageline画出干扰线条,imagecolorallocate添加些大小不一圆圈,用来防止机器识别.
设置http头的信息,设置为发送显示的是image中的jpeg格式.用imagejpeg直接生成显示图片.
最后将两个页面一组合,就可以简单的实现网站页面中对验证码的验证以及随机字符图片的生成.