php网页生成验证码实现程序
发布:smiling 来源: PHP粉丝网 添加日期:2014-07-30 11:31:38 浏览: 评论:0
首先在表单页面展现之前,生成一副图片,并添加上一些干扰像素或线段,防止OCR程序自动识别,再由PHP程序自动生成随机的待验证的一串数字和字母组合的字符,调用imagettftext()函数画到图片中,并把这串字符保存到Session级变量中.
完整实例:自动检测背景和字体,并随机选取背景图片中的一块范围,随机使用字体,显示验证字符串时随机显示字体大小,字符间距,字符颜色等,代码如下:
- <?php
- /**
- * Class for Validate image
- * @author zcs
- * @version 1.0-20090828
- */
- session_start();
- class validimg
- {
- //背景图片目录
- var $backgroundpath = ‘validbg’;
- //生成验证码宽度
- var $width =’80′;
- //生成验证码高度
- var $height =’25′;
- //背景
- var $background;
- //验证文本
- var $text=’abcd’;
- //字体目录
- var $fontpath = ‘validbg’;
- //字体
- var $font=’simhei.ttf’;
- //字体宽度
- var $font_width = ’20′;
- function validimg($text)
- {
- $this->text = $text;
- //随机选取一个背景文件
- $bgdir = @dir($this->backgroundpath);
- while(false !== ($image = $bgdir ->read()))
- {
- if($image != ‘.’ && $image != ‘..’ && $this->checktype($image) != false)
- {
- $backgroundarr[] = $image;
- }
- }
- $bgdir->close();
- //随机选取一个字体文件
- $fonts = @dir($this->fontpath);
- while(false !== ($font = $fonts ->read()))
- {
- if($font != ‘.’ && $font != ‘..’ && $this->checktype($font,’FONT’) != false)
- {
- $fontsarr[] = $font;
- }
- }
- $fonts->close();
- $this->font = $fontsarr[array_rand($fontsarr,1)];
- $this->background = $backgroundarr[array_rand($backgroundarr,1)];
- $this->output();
- }
- //创建背景图像handdle
- function createbackground()
- {
- switch ($this->checktype($this->background))
- {
- case ‘jpg’:
- $bghanddle = @imagecreatefromjpeg( $this->backgroundpath.’/’.$this->background);
- break;
- case ‘gif’:
- $bghanddle = @imagecreatefromgif( $this->backgroundpath.’/’.$this->background);
- break;
- case ‘png’:
- $bghanddle = @imagecreatefrompng( $this->backgroundpath.’/’.$this->background);
- break;
- default:
- }
- return $bghanddle;
- }
- //检查文件类型
- function checktype( $image,$type = ‘IMAGE’)
- {
- $ext = substr( $image, strrpos($image,’.')+1);
- if($type == ‘IMAGE’)
- {
- if ($ext == ‘jpg’ || $ext ==’gif’ || $ext ==’png’)
- return $ext;
- else return false;
- }else if($type == ‘FONT’)
- {
- if ($ext == ‘ttf’)
- return $ext;
- else return false;
- }
- }
- //输出
- function output()
- {
- header(“content-type:image/png;”);
- //生成图像
- $img = @imagecreatetruecolor( $this->width,$this->height);
- $bghanddle = $this->createbackground();
- //从背景图像随机位置载入一块作为背景
- if($bghanddle)
- {
- $randx=rand(0,(imagesx($bghanddle) – $this->width));
- $randy=rand(0,(imagesy($bghanddle) – $this->height));
- }
- imagecopy($img,$bghanddle,0,0,$randx,$randy,$this->width,$this->height);
- //随机选择角度 字体大小 坐标输出文字
- for($i=0;$i<strlen($this->text);$i++)
- {
- $angle = rand(-30,30);
- $fontsize = rand(15,20);
- $x = rand($this->font_width*$i,$this->font_width*$i+10);
- $color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
- imagettftext($img,$fontsize,$angle,$x,20,$color,$this->fontpath.’/’.$this->font,substr($this->text,$i,1));
- }
- imagepng($img);
- //释放资源
- imagedestroy($img);
- imagedestroy($bghanddle);
- }
- }
- new validimg($_SESSION['valid']);
- ?>
测试文件validtest.php,代码如下:
- <?php
- /**
- * 验证码测试
- * @author zcs
- */
- session_start();
- $_SESSION['valid']= randstr();
- echo $_SESSION['valid'];
- //随机生成字符串
- function randstr($num=4)
- {
- $chars = ‘ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789′;
- $randstr=”;
- for($i=0;$i<$num;$i++)
- {
- $randstr.=substr($chars,rand(0,strlen($chars)),1);
- }
- return $randstr;
- }
- ?>
- <img src=”validimg.php” />
- 生成gif动态验证码,PHP生成GIF动画来实现动态图片验证码,以下是实现过程,ImageCode函数通过GIFEncoder类实现的GIF动画
- /**
- * ImageCode 生成GIF图片验证
- * @param $string 字符串
- * @param $width 宽度
- * @param $height 高度
- * */
- function ImageCode($string = '', $width = 75, $height = 25)
- {
- $authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999));
- $board_width = $width;
- $board_height = $height;
- // 生成一个32帧的GIF动画
- for($i = 0; $i < 32; $i++)
- {
- ob_start();
- $image = imagecreate($board_width, $board_height);
- imagecolorallocate($image, 0,0,0);
- // 设定文字颜色数组
- $colorList[] = ImageColorAllocate($image, 15,73,210);
- $colorList[] = ImageColorAllocate($image, 0,64,0);
- $colorList[] = ImageColorAllocate($image, 0,0,64);
- $colorList[] = ImageColorAllocate($image, 0,128,128);
- $colorList[] = ImageColorAllocate($image, 27,52,47);
- $colorList[] = ImageColorAllocate($image, 51,0,102);
- $colorList[] = ImageColorAllocate($image, 0,0,145);
- $colorList[] = ImageColorAllocate($image, 0,0,113);
- $colorList[] = ImageColorAllocate($image, 0,51,51);
- $colorList[] = ImageColorAllocate($image, 158,180,35);
- $colorList[] = ImageColorAllocate($image, 59,59,59);
- $colorList[] = ImageColorAllocate($image, 0,0,0);
- $colorList[] = ImageColorAllocate($image, 1,128,180);
- $colorList[] = ImageColorAllocate($image, 0,153,51);
- $colorList[] = ImageColorAllocate($image, 60,131,1);
- $colorList[] = ImageColorAllocate($image, 0,0,0);
- $fontcolor = ImageColorAllocate($image, 0,0,0);
- $gray = ImageColorAllocate($image, 245,245,245);
- $color = imagecolorallocate($image, 255,255,255);
- $color2 = imagecolorallocate($image, 255,0,0);
- imagefill($image, 0, 0, $gray);
- $space = 15; // 字符间距
- if($i > 0) // 屏蔽第一帧
- {
- for ($k = 0; $k < strlen($authstr); $k++)
- {
- $colorRandom = mt_rand(0,sizeof($colorList)-1);
- $float_top = rand(0,4);
- $float_left = rand(0,3);
- imagestring($image, 6, $space * $k, $top + $float_top, substr($authstr, $k, 1), $colorList[$colorRandom]);
- }
- }
- for ($k = 0; $k < 20; $k++)
- {
- $colorRandom = mt_rand(0,sizeof($colorList)-1);
- imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]);
- }
- // 添加干扰线
- for($k = 0; $k < 3; $k++)
- {
- $colorRandom = mt_rand(0, sizeof($colorList)-1);
- // $todrawline = rand(0,1);
- $todrawline = 1;
- if($todrawline)
- {
- imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);
- }
- else
- {
- $w = mt_rand(0,$board_width);
- $h = mt_rand(0,$board_width);
- imagearc($image, $board_width - floor($w / 2) , floor($h / 2), $w, $h, rand(90,180), rand(180,270), $colorList[$colorRandom]);
- }
- }
- imagegif($image);
- imagedestroy($image);
- $imagedata[] = ob_get_contents();
- ob_clean();
- ++$i;
- }
- $gif = new GIFEncoder($imagedata);
- Header ('Content-type:image/gif');
- echo $gif->GetAnimation();
- }
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- <script language="javascript">
- function refresh_code()
- {
- form1.imgcode.src="verifycode.php?a="+Math.random();
- }
- </script>
- </head>
- <body>
- <form id="form1" name="form1" method="post" action="checkcode.php">
- <label for="code">验证码:</label>
- <input type="text" name="code" id="textfield" />
- <img id="imgcode" src="VerifyCode.php" alt="验证码" />
- <a href="javascript:refresh_code()">看不清?换一个</a>
- <input type="submit" name="button" id="button" value="提交" />
- </form>
- </body>
- </html>
checkcode.php文件如下:
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <?php
- ini_set('display_errors', 'Off');
- session_start();
- if((strtoupper($_POST["code"])) == strtoupper(($_SESSION["VerifyCode"]))){
- print("验证码正确,");
- }else{
- print("验证码错误,");
- }
- echo "提交的验证码:".strtoupper($_POST["code"]).",正确的验证码:".strtoupper($_SESSION["VerifyCode"]);
- ?>
Tags: php网页 php验证码
相关文章
- ·php中网页添加到桌面快捷方式方法(2014-01-05)
- ·php curl函数采集网页出现乱码问题解决方法(2014-09-21)
- ·php获取远程网页源码的程序代码(2015-04-04)
- ·几种PHP实现网页抓取的程序代码(2015-04-09)
- ·清除网页缓存(html asp php java)(2015-04-09)
- ·PHP和MySQL实现简单的网页计数器(2019-12-23)
- ·PHP开发之网页留言板的思路及设计(2020-03-05)
- ·PHP把网页保存为word文件的三种方法(2020-11-05)
- ·php 判断网页是否是utf8编码的方法(2021-02-09)
- ·PHP网页安全认证的实例详解(2021-08-09)
- ·简单实例php验证码代码(2014-08-17)
- ·PHP验证码生成与验证例子(2014-08-22)
- ·PHP验证码生成程序几种方法(2014-08-22)
- ·PHP验证码实现代码简单示例(2014-08-22)
- ·php验证码程序代码(2014-08-22)
- ·PHP验证码之Ajax验证实现方法(2014-08-22)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)