本文章给大家介绍利用session存储与gd库一并生成验证码程序,同时会加入一些干扰元素,这样就可以简单的防机器注册了,下面我来给各位同学介绍介绍.
PHP验证码并生成图片程序,采用了session识别,稍微改进了一下目前网络上流传的PHP验证码,加入杂点,数字颜色随机显示,控制4位数字显示,话不多说了,程序如下,分享出来.
新建yz.php验证码生成文件,以下代码需要打开php的GD库,修改php.in文件的配置,把已经注释掉的行之前的分号取消即可:extension=php_gd2.dll,代码如下:
- <?php
- class ValidationCode
- {
- //属性
- private $width;
- private $height;
- private $codeNum;
- private $image;
- private $disturbColorNum; //干扰元素数目
- private $checkCode;
- function __construct($width=80,$height=20,$codeNum=4)
- {
- $this->width=$width;
- $this->height=$height;
- $this->codeNum=$codeNum;
- $number=floor($width*$height/15);
- if($number>240-$codeNum)
- {
- $this->disturbColorNum=240-$codeNum;
- }else
- {
- $this->disturbColorNum=$number;
- }
- $this->checkCode=$this->createCheckcode();
- }
- function getCheckCode()
- {
- return $this->checkCode;
- }
- private function createImage(){
- $this->image=imagecreatetruecolor($this->width,$this->height);
- $backcolor=imagecolorallocate($this->image,rand(225,255),rand(225,255),rand(255,255));
- imagefill($this->image,0,0,$backcolor);
- $border=imagecolorallocate($this->image,0,0,0);
- imagerectangle($this->image,0,0,$this->width-1,$this->height-1,$border);
- }
- private function setDisturbColor(){
- for($i=0;$i<$this->disturbColorNum;$i++){
- $color=imagecolorallocate($this->image,rand(0,255),rand(0,255),rand(0,255));
- imagesetpixel($this->image,rand(1,$this->width-2),rand(1,$this->height-2),$color);
- }
- for($i=0;$i<10;$i++)
- {
- $color=imagecolorallocate($this->image,rand(0,255),rand(0,255),rand(0,255));
- imagearc($this->image,rand(-10,$this->width),rand(-10,$this->height),rand(30,300),rand(20,300),55,44,$color);
- }
- }
- private function outputText($fontFace=""){
- for($i=0;$i<$this->codeNum;$i++)
- {
- $fontcolor=imagecolorallocate($this->image,rand(0,128),rand(0,128),rand(0,128));
- if($fontFace=="")
- {
- $fontsize=rand(3,5);
- $x=floor($this->width/$this->codeNum)*$i+5;
- $y=rand(0,$this->height-15);
- imagechar($this->image,$fontsize,$x,$y,$this->checkCode{$i},$fontcolor);
- }
- else
- {
- $fontsize=rand(12,16);
- $x=floor(($this->width-8)/$this->codeNum)*$i+8;
- $y=rand($fontsize,$this->height-8);
- imagettftext($this->image,$fontsize,rand(-45,45),$x,$y,$fontcolor,$fontFace,$this->checkCode{$i});
- }
- }
- }
- private function createCheckCode(){
- $code="23456789abcdefghijkmnpqrstuvwrst";
- $str="";
- for($i=0;$i<$this->codeNum;$i++)
- {
- $char=$code{rand(0,strlen($code)-1)};
- $str.=$char;
- }
- return $str;
- }
- private function outputImage()
- {
- if(imagetypes()&IMG_GIF)
- {
- header("Content-Type:image/gif");
- imagepng($this->image);
- }else if(imagetypes()&IMG_JPG)
- {
- header("Content-Type:image/jpeg");
- imagepng($this->image);
- }else if(imagetypes()&IMG_PNG)
- {
- header("Content-Type:image/png");
- imagepng($this->image);
- }else if(imagetypes()&IMG_WBMP){
- header("Content-Type:image/vnd.wap.wbmp");
- imagepng($this->image);
- }else
- {
- die("PHP不支持图片验证码");
- }
- }
- //通过该方法向浏览器输出图像
- function showImage($fontFace="")
- {
- //创建图像背景
- $this->createImage();
- //设置干扰元素
- $this->setDisturbColor();
- //向图像中随机画出文本
- $this->outputText($fontFace);
- //输出图像
- $this->outputImage();
- }
- function __destruct()
- {
- imagedestroy($this->image);
- }
- }
- function checklogin(){
- if(emptyempty($_POST['name']))
- die( '用户名不能为空');
- if(emptyempty($_POST['password']))
- die("密码不能为空");
- if($_SESSION['code']!=$_POST['vertify'])
- die("验证码输入不正确".$_SESSION['code']);
- $username=$_POST['name'];
- $password=md5($_POST['password']);
- //检查是否存在
- conndb($username,$password);
- }
- function conndb($name="",$ps=""){
- $conn=mysql_connect('localhost','root','123456');
- if(!$conn) die("数据库连接失败".mysql_error());
- mysql_select_db('5kan',$conn) or die('选择数据库失败'.mysql_error());
- mysql_set_charset('utf8',$conn);
- $sql="select id from k_user where username='{$name}' and password='{$ps}'";
- $result=mysql_query($sql) or die("SQL语句错误".mysql_error());
- if(mysql_num_rows($result)>0) die("登录成功");
- else die("用户名或者密码错误");
- mysql_close($conn);
- }
- session_start();
- if(!isset($_POST['randnum']))
- {//开源代码Vevb.com
- $code=new ValidationCode(120,20,4);
- $code->showImage("comicbd.ttf"); //显示在页面
- $_SESSION['code']=$code->getCheckCode();//保存在服务器中
- }
- else
- {
- checklogin();
- }
- ?>
到具体调用的地方,用这样的形式:<img src="/yz.php" align="absmiddle" />就可以了;验证的时候验证session:$_SESSION['VCODE']的值就可以了,还可以对以上代码稍微改进,改成两个数字相加求和的形式.
新闻热点
疑难解答