验证码在WEB应用中非常重要,通常用于防止用户恶意提交表单,如恶意注册登录、恶意论坛灌水等。文中举例说明了如何使用PHP生成各种常见的验证码,包括数字验证码、字母数字验证码、中文验证码、算术验证码等。以及它们的Ajax验证过程。
用PHP生成验证码图片。
PHP中生成验证码的原理:使用PHP的GD库生成一张带有验证码的图片,将验证码保存在Session中。
PHP中生成验证码的一般过程如下:
1.生成png图片;
2.设置图片的背景颜色;
3.设置字体颜色和样式;
4.生成4位随机验证码;
5.在png图片上画出每个字符调整后的旋转角度和位置;
6.添加噪音和干扰线,防止注册机器分析原图恶意破解验证码;
7.输出图片;
8.释放图片占用的内存。
示例:
session _ start();getCode(4,60,20);函数getCode($num,$w,$ h){ $ code=' ';for($ I=0;$ i $ num$i ) { $code。=rand(0,9);}//4位验证码也可以由兰德(1000,9999)直接生成。//将生成的验证码写入session,使用$ _ session[' helloweb a _ num ']=$ code进行验证;//创建图片并定义颜色值标题(' content-type : image/png ');$im=imagecreate($w,$ h);$black=imagecolorallocate($im,0,0,0);$gray=imagecolorallocate($im,200,200,200);$ BG color=imagecolor allocate($ im,255,255,255);//填充背景imagefill($im,0,0,$ gray);//绘制边框图像矩形($ im,0,0,$ w-1,$ h-1,$ black);//随机画两条虚线,会干扰$ style=array ($ black,$ black,$ black,$ gray,$ gray,$ gray,$ gray);imagesetstyle($im,$ style);$y1=兰特(0,$ h);$y2=兰特(0,$ h);$y3=兰特(0,$ h);$y4=兰特(0,$ h);imageline($im,0,$y1,$w,$y3,IMG _ COLOR _ style);imageline($im,0,$y2,$w,$y4,IMG _ COLOR _ style);//画布上随机产生大量黑点,起到干扰作用;for($ I=0;$ i 80$i ) { imagesetpixel($im,rand(0,$w),rand(0,$h),$ black);}//在画布上随机显示数字,按照一定的波动范围随机生成字符的水平间距和位置,$strx=rand(3,8);for($ I=0;$ i $ num$i ) { $strpos=rand(1,6);imagestring($im,5,$strx,$strpos,substr($code,$i,1),$ black);$strx=rand(8,12);} image png($ im);//输出图像image destroy($ im);//释放图片占用的内存},自定义函数getCode()解释验证码的生成过程。使用PHP GD库的图像处理功能,可以轻松生成各种想要的图像效果。
Imagecreate():创建新图像imagecolorallocate():为图像指定颜色imagefill():填充图像imagerectangle():绘制矩形(边框)imagesetstyle():设置线条绘制样式imageline()。绘制线段imagesetpixel():绘制点像素imagePNG():以PNG格式将图像输出到浏览器或文件imagedestroy():释放图像占用的内存,将上面的代码保存为code_num.php以供调用。
Ajax刷新和验证。
验证码生成后,我们要在实际项目中应用。通常我们在点击验证码的时候可以使用ajax刷新生成一个新的验证码(有时候生成的验证码肉眼很难识别),也就是“看不清楚就换一个”。填写验证码后,需要验证验证码是否正确。验证过程由后台程序完成,但我们也可以通过ajax实现免刷新验证。
我们创建一个前端页面index.html,加载jquery,并在主体中添加一个验证码表单元素:
p验证码:输入类型=' text ' class=' input ' id=' code _ num ' name=' code _ num ' max length=' 4 '/img src=' http : code _ num . PHP ' id=' getcode _ num ' title='不清楚。点击一个新的' align=' ABS middle '/p pin put type=' button ' class=' BTN ' id=' chk _ num ' value=' submit '/PHP代码,img src=' http3360code _ num.php '调用生成的验证码,当点击验证码时,生成的代码被刷新。
$(function(){ //数字验证$ ('# getcode _ num ')。单击(function () {$ (this))。attr ('src ',' code _ num.php '?).math . random());});});刷新验证码意味着重新请求验证码生成器。这里需要注意的是,在调用code_num.php时,应该采用随机参数来防止缓存。然后,填写验证码后,点击“提交”按钮,通过$,将ajax请求发送到后台chk_code.php。post()。
$(function(){ 0.$('#chk_num ')。单击(function(){ var code _ num=$(' # code _ num '))。val();$.post('chk_code.php?Act=num ',{code:code _ num},function (msg) {if (msg==1) {alert('验证码正确!'。);}else{ alert('错误的验证码!'。);} });});});后台chk_code.php验证:
session _ start();$ code=trim($ _ POST[' code ']);if($ code==$ _ SESSION[' helloweba _ num ']){ echo ' 1 ';}后台将提交的验证码与会话中保存的验证码进行对比,完成验证。
对于其他验证的生成和使用,原则是相同的。开发人员可以根据自己的需要生成各种样式的随机验证码。本次演示提供了数字验证码、字母数字验证码、中文验证码、类谷歌验证码、算术验证码等。由于篇幅有限,其他验证码的生成码跳过,敬请谅解。