php实现验证码的识别(初级篇)
PHP简单验证码功能机制实例详解

PHP简单验证码功能机制实例详解本⽂实例讲述了PHP简单验证码功能机制。
分享给⼤家供⼤家参考,具体如下:⽹站的安全性是开发者不可忽视的⼀个问题,⽬前使⽤最多的⼀种可以提⾼⽹站安全性的⽅法就是使⽤验证码功能机制,有的仅仅使⽤⼀个⼏位数字字母混乱的验证码,有的进⾏⼿机发送短信进⾏验证,有的使⽤邮箱发送邮件进⾏验证,但是这个验证码功能机制是如何实现的呢?下⾯就为⼤家详细解释验证码功能机制的实现思路以及简单的实现⽅法。
1、验证码功能机制实现思路①常规的验证码实现:a、产⽣⼀张png的图⽚b、为图⽚设置背景⾊c、设置字体颜⾊和样式d、产⽣4位数的随机的验证码e、把产⽣的每个字符调整旋转⾓度和位置画到png图⽚上f、加⼊噪点和⼲扰线防⽌注册机器分析原图⽚来恶意注册g、输出图⽚h、释放图⽚所占内存i、将验证码保存到session或是数据库j、将和输⼊的验证码进⾏对⽐②短信(邮箱)验证码机制:a、产⽣4-6位数的随机的验证码b、把产⽣的每个字符保存到session或是数据库c、将验证码发送到⽤户的⼿机(邮箱)d、⽤户在规定时间内进⾏输⼊e、将验证码从session或是数据库中取出f、将和输⼊的验证码进⾏对⽐验证2、简单的实现验证码功能机制①新建captcha.php,写⼊以下代码<?php/*** =======================================* Created by WeiBang Technology.* User: Wei ZhiHua* Date: 2016/10/12 0020* Time: 下午 4:14* Power: 实现验证码功能* =======================================*///开启sessionsession_start();//创建⼀个⼤⼩为 100*30 的验证码$image = imagecreatetruecolor(100, 30);$bgcolor = imagecolorallocate($image, 255, 255, 255);imagefill($image, 0, 0, $bgcolor);$captch_code = '';for ($i = 0; $i < 4; $i++) {$fontsize = 6;$fontcolor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));$data = 'abcdefghijkmnpqrstuvwxy3456789';$fontcontent = substr($data, rand(0, strlen($data) - 1), 1);$captch_code .= $fontcontent;$x = ($i * 100 / 4) + rand(5, 10);$y = rand(5, 10);imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);}//就⽣成的验证码保存到session$_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/*** =======================================* Created by WeiBang Technology.* User: Wei ZhiHua* Date: 2016/10/12 0021* Time: 下午 4:14* Power: 实现验证码功能* =======================================*/if (isset($_REQUEST['authcode'])) {session_start();if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']) {echo "输⼊正确!";} else {echo "输⼊错误!";}exit();}><!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;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)" rel="external nofollow"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>以上就是php验证码的制作思路和实现⽅法,从简单到复杂,可以根据这些写出⾮常完美的验证码功能机制。
PHP如何实现验证码

PHP如何实现验证码现在来说说简单的纯数字验证码吧。
如果是初学者,建议按照我代码的注释 //数字⼀步步来。
最简单的⽅法,还是把整个代码复制⾛了。
新建⼀个captcha.php:<?php//11>设置session,必须处于脚本最顶部session_start();/*$image = imagecreatetruecolor(100, 30); //1>设置验证码图⽚⼤⼩的函数//5>设置验证码颜⾊ imagecolorallocate(int im, int red, int green, int blue);$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff//6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着⾊,col 表⽰欲涂上的颜⾊imagefill($image, 0, 0, $bgcolor);//10>设置变量$captcha_code = "";*///7>⽣成随机数字for($i=0;$i<4;$i++){//设置字体⼤⼩$fontsize = 6;//设置字体颜⾊,随机颜⾊$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜⾊//设置数字$fontcontent = rand(0,9);//10>.=连续定义变量$captcha_code .= $fontcontent;//设置坐标$x = ($i*100/4)+rand(5,10);$y = rand(5,10);imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);}//10>存到session$_SESSION['authcode'] = $captcha_code;//8>增加⼲扰元素,设置雪花点for($i=0;$i<200;$i++){//设置点的颜⾊,50-200颜⾊⽐数字浅,不⼲扰阅读$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));//imagesetpixel — 画⼀个单⼀像素imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);}//9>增加⼲扰元素,设置横线for($i=0;$i<4;$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);}//2>设置头部,image/pngheader('Content-Type: image/png');//3>imagepng() 建⽴png图形函数imagepng($image);//4>imagedestroy() 结束图形函数销毁$imageimagedestroy($image);接着就是静态页的代码了:index.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>⽆标题⽂档</title></head><body><form method="post" action="./form.php"><p>验证码: <img id="captcha_img" border='1' src='./captcha.php?r=echo rand(); ?>' style="width:100px; height:30px" /><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 5px;'/></p></form></body></html>从index.html可以看到,提交的表单是到form.php的,所以还要有⼀个判断的form.php代码:<?phpheader("Content-Type:text/html;charset=utf-8"); //设置头部信息//isset()检测变量是否设置if(isset($_REQUEST['authcode'])){session_start();//strtolower()⼩写函数if(strtolower($_REQUEST['authcode'])== $_SESSION['authcode']){//跳转页⾯echo "<script language=\"javascript\">";echo "document.location=\"./form.php\"";echo "</script>";}else{//提⽰以及跳转页⾯echo "<script language=\"javascript\">";echo "alert('输⼊错误!');";echo "document.location=\"./form.php\"";echo "</script>";}exit();}显⽰页⾯如下:数字加英⽂的验证码,只需更改captcha.php页⾯中的 7》即可,其他两个页⾯不需要动,代码如下:<?php//11>设置session,必须处于脚本最顶部session_start();$image = imagecreatetruecolor(100, 30); //1>设置验证码图⽚⼤⼩的函数//5>设置验证码颜⾊ imagecolorallocate(int im, int red, int green, int blue);$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff//6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着⾊,col 表⽰欲涂上的颜⾊imagefill($image, 0, 0, $bgcolor);//10>设置变量$captcha_code = "";//7>⽣成随机的字母和数字for($i=0;$i<4;$i++){//设置字体⼤⼩$fontsize = 8;//设置字体颜⾊,随机颜⾊$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜⾊//设置需要随机取的值,去掉容易出错的值如0和o$data ='abcdefghigkmnpqrstuvwxy3456789';//取出值,字符串截取⽅法 strlen获取字符串长度$fontcontent = substr($data, rand(0,strlen($data)),1);//10>.=连续定义变量$captcha_code .= $fontcontent;//设置坐标$x = ($i*100/4)+rand(5,10);$y = rand(5,10);imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);}//10>存到session$_SESSION['authcode'] = $captcha_code;//8>增加⼲扰元素,设置雪花点for($i=0;$i<200;$i++){//设置点的颜⾊,50-200颜⾊⽐数字浅,不⼲扰阅读$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));//imagesetpixel — 画⼀个单⼀像素imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);}//9>增加⼲扰元素,设置横线for($i=0;$i<4;$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);}//2>设置头部,image/pngheader('Content-Type: image/png');//3>imagepng() 建⽴png图形函数imagepng($image);//4>imagedestroy() 结束图形函数销毁$imageimagedestroy($image);显⽰页⾯如下:⽣成汉字类验证码,在运⾏过程中,提⽰乱码错误,⽆法显⽰,未能解决,代码如下:php//11>设置session,必须处于脚本最顶部session_start();//1>设置验证码图⽚⼤⼩的函数$image = imagecreatetruecolor(200, 60);//5>设置验证码颜⾊ imagecolorallocate(int im, int red, int green, int blue);$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff//6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着⾊,col 表⽰欲涂上的颜⾊imagefill($image, 0, 0, $bgcolor);//7>设置ttf字体$fontface = 'FZYTK.TTF';//7>设置字库,实现简单的数字储备$str='天地不仁以万物为刍狗圣⼈不仁以百姓为刍狗这句经常出现在控诉暴君暴政上地残暴不仁把万物都当成低贱的猪狗来看待⽽那些⾼⾼在上的所谓圣⼈们也没两样还不是把我们⽼百姓也当成猪狗不如的东西但实在正取的解读是地不情感⽤事对万//str_split()切割字符串为⼀个数组,⼀个中⽂在utf_8为3个字符$strdb = str_split($str,3);//>11$captcha_code = '';//8>⽣成随机的汉⼦for($i=0;$i<4;$i++){//设置字体颜⾊,随机颜⾊$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜⾊//随机选取中⽂$in = rand(0,count($strdb));$cn = $strdb[$in];//将中⽂记录到将保存到session的字符串中$captcha_code .= $cn;/*imagettftext (resource $image ,float $size ,float $angle ,int $x ,int $y,int $color,string $fontfile ,string $text ) 幕布,尺⼨,⾓度,坐标,颜⾊,字体路径,⽂本字符串mt_rand()⽣成更好的随机数,⽐rand()快四倍*/imagettftext($image, mt_rand(20,24),mt_rand(-60,60),(40*$i+20),mt_rand(30,35),$fontcolor,$fontface,$cn);}//11>存到session$_SESSION['authcode'] = $captcha_code;//9>增加⼲扰元素,设置点for($i=0;$i<200;$i++){//设置点的颜⾊,50-200颜⾊⽐数字浅,不⼲扰阅读$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200)); //imagesetpixel — 画⼀个单⼀像素imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor);}//10>增加⼲扰元素,设置线for($i=0;$i<4;$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);}//2>设置头部,image/pngheader('Content-Type: image/png');//3>imagepng() 建⽴png图形函数imagepng($image);//4>imagedestroy() 结束图形函数销毁$imageimagedestroy($image);。
PHP验证码

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break;
case 'NUMBER':
$chars='0123456789'; break;
imagefill($img, 0, 0, $backcolor);
//画线
imageline($img, mt_rand(0,$intwidth/3), mt_rand(0,$intheight/3), mt_rand($intwidth/3,$intwidth), mt_rand($intheight/3,$intheight), $fontcolor);
$randval .= chr($randstr);//chr()返回相对应于 ascii 所指定的单个字符。
//$randval .= mt_rand(0, 9);
}
}
$_SESSION["randval"] = $randval;
$intheight = 18;//验证码背景图的高
$string="";
while(strlen($string)<$len)
$string.=substr($chars,(mt_rand()%strlen($chars)),1);
return $string;
}
?>
//产生随机字符串
function randStr($len=6,$format='ALL') {
switch($format) {
php验证码实例

php验证码实例
一、概述
验证码(CAPTCHA)是一种用于验证用户是否为人类的技术,通过向用户显示一些扭曲的字符或完成一些图像识别任务来确保不是机器人提交表单。
在PHP中,我们可以使用GD库来创建自定义的验证码。
本文将介绍一个简单的PHP验证码实例,包括生成验证码图像、验证用户输入和防止验证码被恶意破解的方法。
二、准备工作
在开始之前,请确保你的PHP环境已启用GD库。
你可以通过在PHP配置文件(php.ini)中取消注释以下行来启用GD库:
然后重启Web服务器以使更改生效。
三、验证码生成
下面是一个简单的PHP验证码生成示例代码:
在上述代码中,我们使用GD库创建了一个指定宽度和高度的空白图像,并随机生成了一些扭曲的字符。
我们使用imagettftext函数将字符绘制到图像上,并使用imagepng函数将图像输出为PNG格式。
最后,我们使用imagedestroy函数销毁图像资源。
你可以根据需要调整代码中的参数,例如更改验证码长度、字体样式等。
四、验证码验证与防止恶意破解
在生成验证码后,我们需要验证用户输入的验证码是否正确。
以下是一个简单的验证码验证示例代码:。
python 登录识别验证码算法-概述说明以及解释

python 登录识别验证码算法-概述说明以及解释1. 引言1.1 概述验证码(Captcha)是一种用于识别用户是否为机器人的技术。
它通常通过在登录、注册或其他需要验证身份的页面上展示一串随机生成的字符或图像,要求用户正确输入或点击相关对象,以证明自己是真实的用户。
验证码的存在旨在防止自动化程序或恶意黑客攻击,保护网站和用户的安全。
在当前互联网的发展背景下,登录系统的验证码已经成为很多网站必备的安全措施之一。
然而,由于验证码的人工智能性质,很多传统的自动化操作和爬虫程序无法绕过验证码的阻拦,从而给网站的自动运营和数据采集带来了一定的困难。
因此,开发一种高效、准确的Python验证码识别算法成为了迫切需求。
本文将着重研究基于Python的验证码识别算法,探究其识别原理和应用方法。
首先,我们将详细介绍验证码的概念和其在用户身份验证中的重要性。
随后,我们将调研现有的验证码识别算法,分析其优缺点和应用场景。
最后,我们将重点讨论基于Python的验证码识别算法的研究,探索其在实际应用中的可行性和效果。
通过本文的阅读,读者将能够全面了解到验证码识别算法在Python 中的实现方式,为解决网站登录阻碍和数据采集问题提供了一种切实可行的解决方案。
同时,本文也可作为对验证码算法感兴趣的读者的参考,为他们进一步深入学习和研究验证码识别领域提供了一个起点。
1.2 文章结构本文主要分为以下几个部分来介绍Python登录识别验证码算法。
第一部分是引言,通过概述、文章结构和目的三个小节来介绍本文要阐述的内容。
第二部分是正文,其中包括验证码的概念和Python登录识别验证码的重要性两个小节。
在验证码的概念部分,将介绍验证码的定义、作用和常见类型等内容,为读者提供对验证码的基本了解。
在Python登录识别验证码的重要性部分,将探讨验证码在登录系统中的重要性,并介绍为何有必要使用Python来实现验证码识别算法。
第三部分是结论,包含现有的验证码识别算法和基于Python的验证码识别算法研究两个小节。
PHP实现随机数字、字母的验证码功能

PHP实现随机数字、字母的验证码功能 可⾃定义⽣成验证码⽂字的⼤⼩、数量、⼲扰项等等,也可以⾃定义验证⽂字的字体。
废话不多说,直接上代码:1、classgd.class.php<?phpClass Captcha{private $_fontfile='';private $_size=36;private $_width=200;private $_height=100;private $_length=4;private $_image=null;private $_snow=0;private $_pixel=0;private $_line=0;public function __construct($config=array()){if(is_array($config)&&count($config)>0){if(isset($config['fontfile'])&&is_file($config['fontfile'])&&is_readable($config['fontfile'])){$this->_fontfile=$config['fontfile'];}else{return false;}if(isset($config['size'])&&$config['size']>0){$this->_size=(int)$config['size'];}if(isset($config['width'])&&$config['width']>0){$this->_width=(int)$config['width'];}if(isset($config['height'])&&$config['height']>0){$this->_height=(int)$config['height'];}if(isset($config['length'])&&$config['length']>0){$this->_length=(int)$config['length'];}if(isset($config['snow'])&&$config['snow']>0){$this->_snow=(int)$config['snow'];}if(isset($config['pixel'])&&$config['pixel']>0){$this->_pixel=(int)$config['pixel'];}if(isset($config['line'])&&$config['line']>0){$this->_line=(int)$config['line'];}$this->_image=imagecreatetruecolor($this->_width,$this->_height);return $this->_image;}else{return false;}}public function getCaptcha(){$white=imagecolorallocate($this->_image,255,255,255);imagefilledrectangle($this->_image,0,0,$this->_width,$this->_height,$white);$str=$this->_generateStr($this->_length);if(false===$str){return false;}$fontfile=$this->_fontfile;for($i=0;$i<$this->_length;$i++){$size=$this->_size;$angle=mt_rand(-30,30);$x=ceil($this->_width/$this->_length)*$i+mt_rand(5,10);$y=ceil($this->_height/1.5);$color=$this->_getRandColor();//针对中⽂字符截取//$text=mb_substr($str,$i,1,'utf-8');$text=$str{$i};imagettftext($this->_image, $size, $angle, $x, $y, $color, $fontfile, $text);}if($this->_snow){$this->_getSnow();}else{if($this->_pixel){$this->_getPixel();}if($this->_line){$this->_getLine();}}header('content-type:image/png');imagepng($this->_image);imagedestroy($this->_image);return strtolower($str);}private function _getSnow(){for($i=1;$i<=$this->_snow;$i++){imagestring($this->_image,mt_rand(1,5),mt_rand(0,$this->_width),mt_rand(0,$this->_height),'*',$this->_getRandColor());}}private function _getPixel(){for($i=1;$i<=$this->_pixel;$i++){imagesetpixel($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor());}}private function _getLine(){for($i=1;$i<=$this->_line;$i++){imageline($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),mt_rand(0,$this->_width),mt_rand(0,$this->_height),$this->_getRandColor()); }}private function _generateStr($length=4){if($length<1 || $length>30){return false;}$chars=array('a','b','c','d','e','f','g','h','k','m','n','p','x','y','z','A','B','C','D','E','F','G','H','K','M','N','P','X','Y','Z',1,2,3,4,5,6,7,8,9);$str=join('',array_rand(array_flip($chars),$length));return $str;}private function _getRandColor(){return imagecolorallocate($this->_image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));}}>2、testCaptcha.php<?phprequire_once 'classgd.class.php';$config=array('fontfile'=>'fonts/simfang.ttf', //引⼊字体⽂件//'snow'=>50,'pixel'=>100,'line'=>10);$captcha=new Captcha($config);$captcha->getCaptcha();>总结以上所述是⼩编给⼤家介绍的PHP实现随机数字、字母的验证码功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
基于Python的简单验证码识别

基于Python的简单验证码识别摘要:验证码在⽹络安全⽅⾯发挥着关键作⽤,验证码的主要⽬的是区分⼈类和计算机,⽤来防⽌⾃动化脚本对⽹站的⼀些恶意⾏为。
⽬前绝⼤多数⽹站都利⽤验证码来阻⽌恶意脚本程序的⼊侵。
验证码经过图像的预处理字符分割,匹配识别等步骤来完成对字符验证的处理,后进过特征提取与匹配等操作完成对⼀个验证码的识别。
本⽂选取了⼀个⽹站进⾏⽹站登录的验证码识别,识别结果取得了预期的效果,较好的识别出了验证码。
关键字:验证码;图像识别;Python;预处理Abstrat:CAPTCHA plays a key role in network security, The main purpose of the CAPTCHA is to differentiate between humans and computers, to prevent some malicious behavior from automating scripts on the site. At present, most websites use Authenticode to prevent the intrusion of malicious script programs. The verification code passes the preprocessing character segmentation of the image, the matching recognition and so on completes the processing to the character verification, the backward feature extraction and the matching operation completes to the verification code recognition. In this paper, a website is selected to identify the verification code, the result obtained the expected results, a better identification of the verification code.Key words:CAPTCHA; Image recognition; Python; Pretreatment;0.引⾔验证码是⽬前互联⽹上⼀种⾮常重要⾮常常见的安全识别技术,先引⽤⼀段来⾃wiki的关于验证码的描述:“全⾃动区分计算机和⼈类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)[1],俗称验证码,是⼀种区分⽤户是计算机和⼈的公共⾃动程序。
php图形验证码

php图形验证码1、⾸先来⼀个html页⾯ index.html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>注册</title></head><body><form action="./register.php" method="post"><img src="Verify.php" onclick="this.src='Verify.php?'+new Date().getTime();" width="100" height="100"><br/> <input type="text" name="verify" placeholder="请输⼊图⽚中的验证码"><br/><input type="submit" value="验证"></form></body></html>2、验证码 register.php<?php/*** 字母+数字的验证码⽣成*/// 开启sessionsession_start();//1.创建⿊⾊画布$image = imagecreatetruecolor(100, 30);//2.为画布定义(背景)颜⾊$bgcolor = imagecolorallocate($image, 255, 255, 255);//3.填充颜⾊imagefill($image, 0, 0, $bgcolor);// 4.设置验证码内容//4.1 定义验证码的内容$content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//4.1 创建⼀个变量存储产⽣的验证码数据,便于⽤户提交核对$captcha = "";for ($i = 0; $i < 4; $i++) {// 字体⼤⼩$fontsize = 10;// 字体颜⾊$fontcolor = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));// 设置字体内容$fontcontent = substr($content, mt_rand(0, strlen($content)), 1);$captcha .= $fontcontent;// 显⽰的坐标$x = ($i * 100 / 4) + mt_rand(5, 10);$y = mt_rand(5, 10);// 填充内容到画布中imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);}$_SESSION["verifyimg"] = $captcha;//4.3 设置背景⼲扰元素for ($$i = 0; $i < 200; $i++) {$pointcolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));imagesetpixel($image, mt_rand(1, 99), mt_rand(1, 29), $pointcolor);}//4.4 设置⼲扰线for ($i = 0; $i < 3; $i++) {$linecolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));imageline($image, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $linecolor);}//5.向浏览器输出图⽚头信息header('content-type:image/png');//6.输出图⽚到浏览器imagepng($image);//7.销毁图⽚imagedestroy($image); >3、提交验证验证码页⾯register.php<?php/*** 接受⽤户登陆时提交的验证码*/session_start();//1. 获取到⽤户提交的验证码$verify = $_POST["verify"];//2. 将session中的验证码和⽤户提交的验证码进⾏核对,当成功时提⽰验证码正确,并销毁之前的session值,不成功则重新提交if(strtolower($_SESSION["verifyimg"]) == strtolower($verify)){echo "ok";$_SESSION["verify"] = "";}else{echo "error";}>4、如果不需要⼲扰线或者背景⼲扰元素,直接把⾥⾯的内容注释就好了,效果就这样的最后来⼀个⼩问题,我再win系统上可以显⽰,传到服务器,图⽚不显⽰,可以超看⼀下是否开启了GD库,怎么操作,先⾃⾏百度,我有空再写。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
近期研究一些突破验证码方面的知识,记录下来。
一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外也希望引起网站管理者的注意,在提供验证码时多些考虑进去。
由于刚刚接触这方面的知识,理解比较浅显,有错误再所难免,欢迎拍砖。
验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。
其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。
目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
我们最常见的验证码1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。
2,随机数字图片验证码。
图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。
没有基本图形图像学知识的人,不可破!3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。
4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。
简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片.(不知道怎么搞的,CSDN又不能上传图片了,我把这四种图片放到下载包中了,可以下载下来对比察看)这四种样式,基本上能代表2中所提到的验证码类型,初步看起来第一个图片最容易破解,第二个次之,第三个更难,第四个最难。
真实情况那?其实这三种图片破解难度相同。
第一个图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。
第二个图片,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。
第三个图片,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。
看似无法突破这个验证码,本篇文章,就一这种类型验证码为例说明,第四个图片,同学们自己搞。
第四个图片,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。
验证码识别一般分为以下几个步骤:1. 取出字模2. 二值化3. 计算特征4. 对照样本1:取出字模识别验证码,毕竟不是专业的OCR识别,并且,由于各个网站的验证码各不相同,所以,最常见的方法就是就是建立这个验证码的特征码库。
去字模时,我们需要多下载几张图片,使这些图片中,包括所有的字符,我们这里的字母只有图片,所以,只要收集到包括0-9的图片即可。
2:二值化二值化就是把图片上的验证数字上每个象素用一种数字表示1,其他部分用0表示。
这样就可以计算出每个数字字模,记录下这些字模来,当作key即可。
3:计算特征把要识别的图片,进行二值化,得到图片特征。
4:对照样本把步骤3种的图片特征码和验证码的字模进行对比,得到验证图片上的数字。
使用目前这种方法,对验证码的识别基本上可以做到100%。
通过以上步骤,您可能说了,并没有发现如何取出干扰素啊!其实取出干扰素的方法很简单,干扰素的一个重要特征是,不能影响验证码的显示效果,所以制作干扰素时它的RGB可能低于或者高于某个特定值,比如我给的例子中的图片,干扰素的RGB各项值是不会超过125的,所以,这样我们就很容易去掉干扰素了。
php代码view plain1.<?php2.define('WORD_WIDTH',9);3.define('WORD_HIGHT',13);4.define('OFFSET_X',7);5.define('OFFSET_Y',3);6.define('WORD_SPACING',4);7.class valite8.{9.public function setImage($Image)10. {11.$this->ImagePath = $Image;12. }13.public function getData()14. {15.return$data;16. }17.public function getResult()18. {19.return$DataArray;20. }21.public function getHec()22. {23.$res = imagecreatefromjpeg($this->ImagePath);24.$size = getimagesize($this->ImagePath);25.$data = array();26.for($i=0; $i < $size[1]; ++$i)27. {28.for($j=0; $j < $size[0]; ++$j)29. {30.$rgb = imagecolorat($res,$j,$i);31.$rgbarray = imagecolorsforindex($res, $rgb);32.if($rgbarray['red'] < 125 || $rgbarray['green']<12533. || $rgbarray['blue'] < 125)34. {35.$data[$i][$j]=1;36. }else{37.$data[$i][$j]=0;38. }39. }40. }41.$this->DataArray = $data;42.$this->ImageSize = $size;43. }44.public function run()45. {46.$result="";47.// 查找4个数字48.$data = array("","","","");49.for($i=0;$i<4;++$i)50. {51.$x = ($i*(WORD_WIDTH+WORD_SPACING))+OFFSET_X;52.$y = OFFSET_Y;53.for($h = $y; $h < (OFFSET_Y+WORD_HIGHT); ++ $h)54. {55.for($w = $x; $w < ($x+WORD_WIDTH); ++$w)56. {57.$data[$i].=$this->DataArray[$h][$w];58. }59. }60.61. }62.// 进行关键字匹配63.foreach($data as$numKey => $numString)64. {65.$max=0.0;66.$num = 0;67.foreach($this->Keys as$key => $value)68. {69.$percent=0.0;70. similar_text($value, $numString,$percent);71.if(intval($percent) > $max)72. {73.$max = $percent;74.$num = $key;75.if(intval($percent) > 95)76.break;77. }78. }79.$result.=$num;80. }81.$this->data = $result;82.// 查找最佳匹配数字83.return$result;84. }85.public function Draw()86. {87.for($i=0; $i<$this->ImageSize[1]; ++$i)88. {89.for($j=0; $j<$this->ImageSize[0]; ++$j)90. {91. echo $this->DataArray[$i][$j];92. }93. echo "/n";94. }95. }96.public function __construct()97. {98.$this->Keys = array(99.'0'=>'000111000011111110011000110110000011110000011110000011110000011110000011110000011110000011011000110011111110000111000',100.'1'=>'0001110000111110000111110000000110000000110000000110000 00011000000011000000011000000011000000011000011111111011111111', 101.'2'=>'0111110001111111001000001100000001110000001100000011000 00011000000110000001100000011000000110000000011111110111111110', 102.'3'=>'0111110001111111101000001100000001100000011000111110000 11111100000001110000000111000000110100001110111111100011111000', 103.'4'=>'0000011000000111000000111000001111000011011000011011000 11001100011001100111111111111111111000001100000001100000001100', 104.'5'=>105.'1111111101111111101100000001100000001100000001111100001111111 00000001110000000111000000110100001110111111100011111000', 106.'6'=>'0001111000011111100110000100110000001100000001101111001 11111110111000111110000011110000011011000111011111110000111100', 107.'7'=>'0111111110111111110000000110000000100000001100000011000 00001000000011000000010000000110000000110000001100000001100000', 108.'8'=>'0011111000111111100110001100110001100111011100011111000 01111100011101110110000011110000011111000111011111110001111100', 109.'9'=>'0011110000111111101110001111100000111100000111110001110 11111111001111011000000011000000110010000110011111100001111000', 110. );111. }112.protected$ImagePath;113.protected$DataArray;114.protected$ImageSize;115.protected$data;116.protected$Keys;117.protected$NumStringArray;118.}119.?>我做了一个例子,你可以从这里下载下载破解完成上面的验证码,我们就可以使用snoopy(比curl要轻量,所以我喜欢)来模拟浏览器器,访问网站了。