[PHP] 网页验证码的实现

来源:互联网 发布:白鹿原小说败笔 知乎 编辑:程序博客网 时间:2024/06/05 00:31
验证码的作用是区分人与机器。防止恶意注册、留言等。


首先我们先创建一个画布。用来存放验证码。
画布生成为100 × 30 px大小的图片,并把它由默认的黑色改成白色。



$image = imagecreatetruecolor(100,30);   // 创建画布,默认为黑色                                                              $white  = imagecolorallocate($image,255,255,255);   //白色imagefill( $image,0,0,$white );  //把画布添加成白色


然后利用for循环设置随机的四个数字作为验证码

for($i=0;$i<4;$i++){$size = 6; //字体大小$black = imagecolorallocate($image,0,0,0); //字体黑色$rand_size = mt_rand(0,9); //随机数字$x=$i*25+mt_rand(5,10); //宽度$y=mt_rand(5,10); //高度imagestring($image,$size,$x,$y,$rand_size,$black); }



如果想增加点难度让机器更难识别验证码,可以使用大小写字母加数字的方式。


for($i=0;$i<4;$i++){$size = 6;$x = $i*25+mt_rand(5,10);$y = mt_rand(5,10);$sizi_color = imagecolorallocate($image,mt_rand(80,220),mt_rand(80,220),mt_rand(80,220));$char = join("",array_merge(range('a','z'),range('A','Z'),range(0,9))); //把所有数组转换成字符串$char = str_shuffle($char);  //随机打乱字符串$char = substr($char,0,1);  //取其中一个字符串imagestring($image,$size,$x,$y,$char,$sizi_color);}




注意事项:控制好数字的大小和分布,避免重叠或者显示不全。


然后我们利用imagesetpixel 函数增加干扰元素 - 点。使机器更难识别验证码。


for($k=0;$k<200;$k++){$rand_color = imagecolorallocate($image,mt_rand(50,200),mt_rand(50,200),mt_rand(50,200));imagesetpixel($image,mt_rand(1,99),mt_rand(1,29),$rand_color);}



接下来我们还可以在验证码上添加一些干扰元素 - 线。 



for($n=0;$n<5;$n++){$line_color = imagecolorallocate($image,mt_rand(80,220),mt_rand(80,220),mt_rand(80,220));imageline($image,mt_rand(1,99),mt_rand(1,29),mt_rand(1,99),mt_rand(1,29),$line_color);}



这里要特别说明一下函数 imageline() , 中间有四个坐标参数,因为是两点构成一条直线, xy坐标为一个点, 所以参数为四个。




header('content-type:image/png');//设置文件输出格式imagepng( $image ); //以png格式输出$image图像imagedestroy( $image ); //销毁图像




注意事项:输出图片之前,一定要提前输出图片的 header 信息。


数字效果图 :
   


数字+字母效果图:  
原创粉丝点击