php制作动态随机验证码
CAPTCHA是“完全自动化的公共图灵测试来区分计算机和人类”的缩写,它是一个公共的自动程序,用于区分用户与计算机或人类。它可以防止:恶意密码破解、刷票、论坛灌水,有效防止黑客用特定程序通过蛮力破解不断尝试登录特定注册用户。其实现在很多网站都流行使用验证码的方式,我们已经用比较简单的方式实现了这个功能。
这个问题可以由计算机生成和判断,但只有人类才能解决。因为电脑不能回答验证码的问题,所以回答问题的用户可以被视为人类。
用php制作动态验证码是基于Php中的图像处理。这里简单介绍一下php中的图像处理。
1.php图像处理简介。
在PHP5中,动态图像的处理比以前容易得多。PHP5在php.ini文件中包含了GD扩展包,所以只有去掉GD扩展包对应的注释才能正常使用。PHP5中包含的GD库是升级后的GD2库,其中包含一些支持真彩色图像处理的有用的JPG函数。
生成的图形一般以PHP文档格式存储,但动态图形可以通过SRC (HTML图像插入模式)直接获取。例如验证码、水印、缩略图等。
创建图像的一般过程:
1).设置标题,并告诉浏览器您想要生成的MIME类型。
2).创建一个图像区域,所有未来的操作都将基于该图像区域。
3)在空白图像区域绘制填充背景。
4)在背景上画一个图形轮廓,输入文字。
5).输出最终图形。
6)清除所有资源。
7).其他页面称为图像。
第一步是设置文件的MIME类型,并将输出类型更改为图像流。
复制代码如下:header('内容类型: image/png;'。);
一般生成的图像可以是png,jpeg,gif,wbmp。
第二步是创建图形区域和图像背景。
Imagecreatetruecolor()返回一个表示x_size和y_size的黑色图像的图像标识符。语法:资源图像创建真实颜色(int $宽度,int $高度)
复制代码如下: $ im=image create true color(200,200);
第三,在空白图像区域绘制填充背景。
必须有彩色填充物;imagecolorrallocate-为图像分配颜色;语法:int imagecolor locate(resource $ image,int $ red,int $ green,int $ blue)。
复制代码如下: $ blue=imagecolor locate($ im,0,102,255);
用这种蓝色填充背景;Imagefill -区域填充;语法:bool imagefill (resource $ image,int $ x,int $ y,int $ color)。
复制代码如下:imagefill($im,0,0,$ blue);
第四步:在蓝色背景上输入一些线条和字符。
彩色填料
复制代码如下: $ white=imagecolor locate($ im,255,255,255);
画两条线段:imageline。
Imageline()使用颜色在图像中绘制从坐标x1,y1到x2,y2(图像左上角为0,0)的线段。语法:bool image行(resource $ image,int $ x1,int $ y1,int $ x2,int $ y2,int $ color)。
复制代码如下:图像行($ im,0,0,200,200,$ white);imageline($im,200,0,0,200,$ white);
水平绘制字符串:imagestring。
Imagestring()将col color中的字符串s绘制到image表示的图像的x和y坐标(这是字符串左上角的坐标,整个图像的左上角是0,0)。如果字体为1、2、3、4或5,则使用内置字体。语法:bool imagestring (resource $ image,int $ font,int $ x,int $ y,string $ s,int $ col)。
复制代码如下: ImageString ($ IM,5,66,20,'京鲸',$ white);
第五步,输出最终图形。
Imagepng()以png格式将GD图像流(图像)输出到标准输出(通常是浏览器),如果给定了文件名,则输出到文件。语法:bool imagepng(资源$ image [,字符串$ filename])
复制代码如下: imagepng($ im);
第六步,我想清空所有资源。
Imagedestroy()释放与映像相关联的内存。语法:bool imagedestroy(资源$ image)
复制代码如下: image destroy($ im);
其他页面(html)调用创建的图形。
复制的代码如下: img src=' http 3360 demo 4 . php ' alt='图片由PHP创建'/
示例代码如下:
复制代码如下:Php //步骤1,设置文件的MIME类型头(' content-type : image/png;').);//第二步,创建一个带有图像背景的图形区域$ im=imagecreate真彩色(200,200);//第三步,在空白图像区域画出填充背景$ blue=imagecolorclocate($ im,0,102,255);imagefill($im,0,0,$ blue);//第四步:在蓝色背景上输入一些线条和字符。$ white=imagecolorlocate ($ im,255,255,255);imageline($im,0,0,200,200,$ white);imageline($im,200,0,0,200,$ white);Jing说,imagestring($im,5,66,20)。鲸',$ white);//第五步,输出最终的图形imagepng($ im);//第六步,我想把所有资源清空到image destroy($ im);
显示效果:
2.创建动态验证码。
附件:代码来源地址https://github.com/cnblogs-/php-captcha.
1.创建一张带有验证码的图片,模糊背景。
随机代码是十六进制的。模糊是指在图片背景上添加线条和雪花。
1)创建随机代码复制代码如下: for($ I=0;$ i $ _ rnd _ code$i ) { $_nmsg。=dechex(mt_rand(0,15));}string dechex (int $number),返回包含给定number参数的十六进制表示形式的字符串。
2)SESSION中保存的复制代码如下:$_SESSION['code']=$_nms。
3)创建图片。
复制代码如下://创建图像$ _ img=imagecreate true color($ _ width,$ _ height);//white $ _ white=imagecolorclocate($ _ img,255,255,255);//Fill imagefill($_img,0,0,$ _ white);If ($_flag) {//black,border $ _ black=imagecolor locate($ _ img,0,0,0);imagerectangle($_img,0,0,$_width-1,$_height-1,$ _ black);}
4)背景模糊。
复制代码如下://为($i=0)随机画6条线;$ i6$ I){ $ _ rnd _ color=imagecolor allocate($ _ img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));imageline($_img、mt_rand(0,$_width)、mt_rand(0,$_height)、mt_rand(0,$_width)、mt_rand(0,$_height)、$ _ rnd _ color);}//随机雪花为($ I=0;100美元;$ I){ $ _ rnd _ color=imagecolor allocate($ _ img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),' *,$ _ rnd _ color);}
5)输出和销毁。
复制代码如下://(I=0)的输出验证码;$ is tren($ _ SESSION[' code ']);$ I){ $ _ rnd _ color=imagecolor allocate($ _ img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));imagestring($_img,5,$i*$_width/$_rnd_code mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$ _ rnd _ color);}//输出图像头(' content-type : image/png ');image png($ _ img);//销毁image destroy($ _ img);
将其封装在global.func.php全局函数库中,并使用函数名_code()进行调用。我们将设置四个参数:$ _ width、$ _ height、$ _ rnd _ code和$ _ flag来增强功能的灵活性。
* @ param int $ _验证码的宽度长度:长度为6位的建议75 50;如果需要8位数,建议75 50 50,以此类推* @ param int $ _验证码高度* @ param int $ _ rnd _验证码位数* @ param bool $ _标志验证码是否需要边框:true有边框,false没有边框(默认)。
封装的代码如下:
复制代码代码如下:PHP/* * *[验证码】(三)2015-2100景鲸。* *这是免费软件* $ Id : global.func.php 2015-02-05 20:5:56京鲸$ */* * * _代码()是验证码函数* @ access public * @ param int $ _ width验证码的长度:如果要6位长度推荐75 50;如果要8位,推荐75 50 50,依次类推* @param int $_height验证码的高度* @param int $_rnd_code验证码的位数* @ param bool $ _标志验证码是否需要边框:真有边框,假的无边框(默认)* @返回空的这个函数执行后产生一个验证码*/function _code($_width=75,$_height=25,$_rnd_code=4,$_flag=false) { //创建随机码对于($ I=0;$ i $ _ rnd _ code$i ) { $_nmsg .=dechex(mt_rand(0,15));} //保存在SESSION $ _ SESSION[' code ']=$ _ nmsg;//创建一张图像$ _ img=imagecreatetrue color($ _ width,$ _ height);//白色$ _ white=image color allocate($ _ img,255,255,255);//填充imagefill($_img,0,0,$ _ white);if ($_flag) { //黑色,边框$ _ black=image color allocate($ _ img,0,0,0);imagerectangle($_img,0,0,$_width-1,$_height-1,$ _ black);} //随即画出6个线条对于($ I=0;$ i6 $ I){ $ _ rnd _ color=image color allocate($ _ img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));imageline($_img、mt_rand(0,$_width)、mt_rand(0,$_height)、mt_rand(0,$_width)、mt_rand(0,$_height)、$ _ rnd _ color);} //随即雪花对于($ I=0;100美元;$ I){ $ _ rnd _ color=image color allocate($ _ img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),' *,$ _ rnd _ color);} //输出验证码对于($ I=0;$ is tren($ _ SESSION[' code ']);$ I){ $ _ rnd _ color=image color allocate($ _ img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));imagestring($_img,5,$i*$_width/$_rnd_code mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$ _ rnd _ color);} //输出图像标题(“内容类型:图像/png”);图像png($ _ img);//销毁图像销毁($ _ img);}?
2.创建验证机制
创建服务器端编程语言(专业超文本预处理器的缩写)验证页面,通过会议来检验验证码是否一致。
1)创建verification-code.php验证页面
复制代码代码如下:PHP/* * *[验证码】(三)2015-2100景鲸。**这是免费软件* $ Id: verification-code.php 2015-02-05 20:5:56京鲸$*//设置字符集编码标题('内容-类型:文本/html;charset=utf-8 ');DOCTYPE html html head meta charset=' UTF-8 '标题验证码/标题链接rel='样式表type=' text/CSS ' href=' style/basic。CSS/head body div id=' test code ' form方法=' post ' name=' verification ' action=' verification-code。PHP?操作=验证dl dd验证码:输入类型=' text ' name=' code ' class=' code '/img src=' http : code img。PHP ' id=' codeimg '/DD ddin put type=' submit ' class=' submit ' value='验证//dd /dl /form /div/body/html
显示如下:
2)创建产生验证码图片页面
创建codeimg.php为verification-code.php html代码里的img提供验证码图片
首先必须在codeimg.php页面开启会议;
其次,将我们封装好的global.func.php全局函数库引入进来;
最后,运行_ code();
复制代码代码如下:PHP/* * *[验证码】(三)2015-2100景鲸。* *这是免费软件* $ Id: codeimg.php 2015-02-05 20:5:56京鲸$*//开启session _ start();//引入全局函数库(自定义)需要目录名(__FILE__)./包括/全局。功能。PHP ';//运行验证码函数。通过数据库的_代码方法,设置验证码的各种属性,生成图片_code(125,25,6,false);
3)创建会议检验机制
首先必须在verification-code.php页面也开启会议;
其次,设计提交验证码的方式,本文以得到方式提交,当动作=验证时提交成功;
最后,创建验证函数,原理是将客户端用户提交的验证码同服务器codeimg.php中会议的验证码是否一致;这里有一个射流研究…弹窗函数_alert_back(),我们也把它封装在global.func.php里;
修改verification-code.php中服务器端编程语言(专业超文本预处理器的缩写)代码如下:
复制代码代码如下:PHP/* * *[验证码】(三)2015-2100景鲸。**这是免费软件* $ Id: verification-code.php 2015-02-05 20:5:56京鲸$*//设置字符集编码标题('内容-类型:文本/html;charset=utf-8 ');//开启session _ start();//引入全局函数库(自定义)需要目录名(__FILE__)./包括/全局。功能。PHP ';//检验验证码if($ _ GET[' action ']==' verification '){ if(!($ _ POST[' code ']==$ _ SESSION[' code ']){ _ alert _ back('验证码不正确!');}else{ _alert_back('验证码通过!');}} ?DOCTYPE html html head meta charset=' UTF-8 '标题验证码/标题链接rel='样式表type=' text/CSS ' href=' style/basic。CSS '/脚本类型=' text/JavaScript ' src=' http : js/codeimg。js '/script/head dy div id=' test code ' form方法=' post ' name=' verification ' action=' verification-code。PHP?操作=验证dl dd验证码:输入类型=' text ' name=' code ' class=' code '/img src=' http : code img。PHP ' id=' codeimg '/DD ddin put type=' submit ' class=' submit ' value='验证//dd /dl /form /div/body/html
3.实现点击验证码图片更新验证码
上面若想实现验证码更新,必须刷新页面;我们写一个codeimg.js函数实现点击验证码图片更新验证码
复制代码代码如下:窗口。onload=function(){ var code=document。getelementbyid(' codeimg ');//通过编号找到超文本标记语言中图片标签code.onclick=function () {//为标签添加点击事件this.src='codeimg.php?TM='数学。random();//修改时间,重新指向codeimg.php };}
然后在verification-code.php html代码头里环它即可。
版权声明:php制作动态随机验证码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。