<span style="font-size:12px;"> </span>
验证码的实现分为四个部分:
(1)生成底图<并且在其中加入干扰元素,gd图片处理库>
(2)生成验证内容<随机数生成,mt_rand函数>
(3)生成验证图片
(4)校验验证内容<session保存数据,ajax验证>
先查看你的php是否开启了gd库支持,这个自行百度。
show you the code!
这是captcha.php文件代码,生成纯数字的代码已经被我注释掉了,现在可以生成数字与字母的混合验证。
<?php session_start();//开启session,处于程序的最顶部 $image=imagecreatetruecolor(100,30);//创建底图 $bgcolor=imagecolorallocate($image,255,255,255);//设置颜色 imagefill($image,0,0,$bgcolor);//填充颜色 //下面是纯数字的验证码 /*for($i=0;$i<4;$i++) { $fontsize=6; $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//设置数字颜色,颜色要深 $fontcontent=rand(0,9);//生成随机内容 $x=($i*100/4)+rand(5,10); $y=rand(5,10); /*这个$X,$Y的坐标是绘制文字的左上角坐标 Y高度是30 要能在背景里 $Y值+文字的高度要<30; 所以rand(5,20)会超出范围 X于此类似 因为X方向最长是100总共4个字符 100/4是每个字符的间距 用在循环中就表示 4个的起始点分别是0,25 ,50,75 然后再加上随机数有浮动效果 */ // imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//显示资源 //} //下方是数字与字母的混合体 $captch_code="";//存储返回的字符 for($i=0;$i<4;$i++) { $fontsize=6; $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//设置数字颜色,颜色要深 $data='qwertyuiopkjhgfdsazxcvbnm123456789';//设置字典数据 $fontcontent=substr($data,rand(0,strlen($data)),1);//取一个字典中的数据 $captch_code.=$fontcontent;//将取出的数据合取到captch_code中 $x=($i*100/4)+rand(5,10); $y=rand(5,10); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); } //echo $captch_code; $_SESSION['authcode']=$captch_code; //设置点的干扰元素 for($i=0;$i<200;$i++) { $pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));//设置点的颜色,颜色要浅 imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);//显示资源 } //增加线的干扰元素 for($i=0;$i<3;$i++) { $linecolor=imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220)); imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor); } header('content-type:image/png'); imagepng($image);//显示图片 imagedestroy($image);//销毁资源 ?>
下面是form.php文件的代码,界面处理。
<?php if(isset($_REQUEST['authcode']))//判断authcode变量是否被设置 { session_start(); if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) //增加验证码的正确性,将用户输入的字符都变成小写 { //header('Content-type: text/html; charset=UTF8'); echo '<font color="#0000CC">输入正确</font>'; } else{ // header('Content-type: text/html; charset=UTF8'); echo '<font color="#CC0000"><b>输入错误</b></font>'; } exit(); } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>登陆界面</title> </head> <body> <form method="post" action="form.php"> <p>验证码图片:<img id="captcha_img" border="1" src="captcha.php?r=<?php echo rand();?>" width="100" height="30"><!--自己暂时不太懂--> <a href="javascript:void(0)" onClick="document.getElementById('captcha_img').src='captcha.php?r='+Math.random()">换一个?</a> </p> <p>请输入图片的内容:<input type="text" name="authcode" value=""/></p> <p><input type="submit" value="提交" style="padding:6px 20px;"></p> </form> </body> </html>
直接在服务器上打开form.php即可进行验证,另外本人知识有限,有什么不对的地方,希望大家批评指正!谢谢!
我又来了,下面是汉字的验证码,其实汉字和数字的存储验证方式是一样的,只是生成验证码内容的方式不同。
下面是汉字验证码处理界面
form_cn.php
<?php if(isset($_REQUEST['authcode'])) { session_start(); if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) { header('Content-type: text/html; charset=UTF8;'); echo '<font color="#0000CC">输入正确,更多功能正在完善</font>'; } else{ header('Content-type: text/html; charset=UTF8'); echo '<font color="#CC0000"><b>输入错误,更多功能正在完善</b></font>'; } exit(); } header('Content-type: text/html; charset=UTF8'); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>确认验证</title> </head> <body> <form method="post" action="./form_cn.php"> <p>验证码图片:<img id="captcha_img" border="1" src="./captcha_cn.php?r=<?php echo rand();?>" width="200" height="60"> <a href="javascript:void(0)" onClick="document.getElementById('captcha_img').src='./captcha_cn.php?r='+Math.random()">换一个?</a> </p> <p>请输入图片的内容:<input type="text" name="authcode" value=""/></p> <p><input type="submit" value="提交" style="padding:6px 20px;"></p> </form> </body> </html>
<?php session_start(); $image=imagecreatetruecolor(200, 60); $bgcolor=imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $bgcolor); $fontface='a.ttf'; //字体一定要命名为英文 $str="的一是在小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批如应形想制心样干都向变关点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然问比展那它最及外没看治细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝"; $strdb=str_split($str,3);//将字符串转换为数组 //header('content-type:text/html; charset=utf-8'); //var_dump($strdb); //die(); $captch_code=''; for($i=0;$i<4;$i++)//写汉字 { $fontcolor=imagecolorallocate($image,rand(0,120), rand(0,120), rand(0,120));//字体颜色 $index=rand(0,count($strdb)); $cn=$strdb[$index]; $captch_code.=$cn; imagettftext($image, mt_rand(20,24), mt_rand(-60,60),(40*$i+20), mt_rand(30,35), $fontcolor, $fontface, $cn); //imagettftext(image, size, angle, x, y, color, fontfile, text) } $_SESSION['authcode']=$captch_code; for ($i=0; $i < 200; $i++) //干扰点 { $pointcolor=imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200)); imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor); } for ($i=0; $i < 3; $i++) //干扰线 { $linecolor=imagecolorallocate($image, rand(80,220), rand(80,220), rand(80,220)); imageline($image, rand(1,199), rand(1,59),rand(1,199), rand(1,59), $linecolor); } header('content-type: image/png'); imagepng($image); imagedestroy($image); ?>
版权声明:本文为博主原创文章,未经博主允许不得转载。