什么是验证码❓
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
制作简单的前端样式,表单和验证码判断(后端)
<html><head><metacharset="utf-8"><title></title></head><body><formmethod="post"action=""> 验证码: <inputtype="text"size="10"name="a"/><imgsrc="next1.php"/> //跳转到后端的图像 <inputtype="submit"name="submit"value="提交"/></form></body></html>
验证码生成的后端代码
session_start(); header('Content-type: image/gif'); $image_w=100; $image_h=25; $number=range(0,9); $character=range("Z","A"); $result=array_merge($number,$character); /*array_merge函数是将两个数组按先后的顺序合并到一起,合并到一起组成一个新的数组*/$string=""; $len=count($result); for($i=0;$i<4;$i++) { $new_number[$i]=$result[rand(0,$len-1)]; $string=$string.$new_number[$i]; } $_SESSION['string']=$string; $check_image=imagecreatetruecolor($image_w,$image_h); /*创建一个画布,使用PHP的GD Library创建新的真彩色图像,函数返回图像资源标识符*/$white=imagecolorallocate($check_image, 255, 255, 255); // 设置白色的图形$black=imagecolorallocate($check_image, 0, 0, 0); // 设置黑色的图形 imagefill($check_image,0,0,$white);/*imagefill()函数在 image 图像的坐标x,y (图像左上角为0, 0) 处用 color 颜色执行区域填充*/for($i=0;$i<100;$i++) { imagesetpixel($check_image, rand(0,$image_w), rand(0,$image_h),$black);/*设置干扰,使用 imagesetpixel()函数给图片添加干扰点。*/ } for($i=0;$i<count($new_number);$i++) { $x=mt_rand(1,8)+$image_w*$i/4; /*该函数是产生随机值的更好选择,返回结果的速度是 rand() 函数的 4 倍 */$y=mt_rand(1,$image_h/4); //指定生成位置X、Y轴偏移量$color=imagecolorallocate($check_image,mt_rand(0,200),mt_rand(0,200),mt_rand(0,200)); imagestring($check_image,5,$x,$y,$new_number[$i],$color);/*imagestring()函数是PHP中的内置函数,用于水平绘制字符串。此函数在给定位置绘制字符串*/ } imagepng($check_image);//以PNG格式将图像输出到浏览器或文件imagedestroy($check_image);
运行结果
验证效果的演示
遇到的问题
当设置 header('Content-type: image/gif'); 直接运行后端验证码图片
当设置 header('Content_type: image/gif'); 直接运行后端验证码图片
可以检测报错
乱码是因为头文件
但运行前端代码还是可以生效
同时还要注意php的版本
避免出现以下情况
解决办法
进入php.ini 找到extension=php_gd2.dll ,将其前面的 ‘;’ 去掉即可