PHP 用session与gd库实现简单验证码生成与验证的类
验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的。目前大大小小的网站都有验证码。今天自己实现了一个简单的验证码类。说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下。当然,因为字体的原因,要想一眼看出来并不容易。同时,为了避免字母的大小写与数字混淆,又去掉了那些看起来很像的字母数字。 
类:
<?php
/**
 *简单生成验证码类
 */
class Captcha {
    private $width;//验证码宽度
    private $height;//验证码高度
    private $countOfChars;//字符数
    //private $distrubLines;//干扰线条数
    private $chars;//随机生成的字符串
    public function __construct($width=100,$height=30,$countOfChars=4,$distrubLines=2) {
    //初始化参数
    $this->width=$width;
    $this->height=$height;
    $this->countOfChars=$countOfChars;
    session_start();
    }
    /**
     * 执行全部动作,生成验证码并直接输出
     */
    public function execute(){
    $imageHandle=$this->createImage();
    $this->createChars();
    $this->drawChars($imageHandle);
    $this->outImage($imageHandle);
    }
    /**
     * 创建画布,并随机填充颜色
     * @return 返回画布句柄
     */
    public function createImage(){
    $imageHandle=  imagecreate($this->width, $this->height);
    //随机背景颜色
        $randColor=imagecolorallocate($imageHandle,  50, mt_rand(0, 50), mt_rand(0, 50));
    imagefill($imageHandle, 0, 0, $randColor);
    return $imageHandle;
    }
    /**
     * 生成随机字符
     */
    private function createChars(){
    //候选字符
    $str='ABCDEFGHJKLMNPQRSTUVWXZabcdefghijkmnpqtuvwx2346789';
    $chars='';
    for($i=0;$i<$this->countOfChars;$i++){
        $chars.=$str[mt_rand(0,strlen($str)-1)];
    }
    $this->chars=$chars;
    //保存在会话中
    $_SESSION['captcha']=strtolower($chars);
    }
    /**
     * 将字符写入图像
     * @param type $imageHandle 图像句柄
     */
    private function drawChars($imageHandle){
    if($this->chars!=null){
        $font='/home/WWW/YuWeiLiShuFT.ttf';
        for($i=0;$i<strlen($this->chars);$i++){
        $color=  imagecolorallocate($imageHandle,mt_rand(50, 200),mt_rand(100, 255),255);
        imagefttext($imageHandle,30, 30,$i*20+10,25,$color,$font,$this->chars[$i]);
        }
    }
    }
    /**
     * 输出图像
     * @param type $imageHandle 图像句柄
     */
    private function outImage($imageHandle){
    imagepng($imageHandle);
    imagedestroy($imageHandle);
    }
    /**
     * 判断用户输入的验证码是否正确
     * @param type $usrInput 用户的输入
     * @return boolean 验证码是否匹配
     */
    public static function isRight($usrInput){
    if(isset($_SESSION['captcha'])){
        if(strtolower($usrInput)==$_SESSION['captcha']){
        $_SESSION['captcha']=null;
        return true;
        }else{
        $_SESSION['captcha']=null;
        return false;
        }
    }
    }
}
把验证设置成了静态方法,因为生成验证码后已经把验证码存到了session中,验证时直接调用静态方法,而不需要实例化这个类了。 
上面的字体可以随意设置。
下面的代码讲返回一个图像,实例化Captcha类后动态生成的一个图像。(outCaptcha.php)
<?php
require('Captcha.php');
$code=  new Captcha();
header('Content-Type:image/png');
$code->execute();
header(‘Content-Type:image/png’);
这句话的作用是告诉浏览器输出的是png图像,而不是html代码。浏览器收到后就将下面的输出解析成图像。
然后写一个html静态页面(testCaptcha.html),创建表单
<!DOCTYPE html>
<html>
    <head>
        <title>验证码测试</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <h1>请输入验证码:</h1>
        <img src="outCaptcha.php"/>
        <form method="POST" action="prove.php">
            <input type="text" name="input_captcha"/>
            <button name="submit">确定</button>
        </form>
    </body>
</html>
仅仅是这样是不够的,看到表单提交的地址了么?那个就是用来验证验证码是否输入正确的代码:
session_start();
$inputCaptcha= trim($_POST['input_captcha']);
require('Captcha.php');
if(Captcha::isRight($inputCaptcha)){
    echo '验证码正确';
}else{
    echo '验证码错误或已过期';
}
session_destroy();
这里还是要导入Captcha这个类,然后调用其静态方法来验证你的输入。最后销毁整个会话。
最后看看效果吧 
 
点击确定,跳转的验证的页面:
 
太好了,成功了。那再故意输错试试,后退一下,然后刷新(如果不刷新浏览器将直接调用缓存中的验证码图片,这个时候我们的验证码还没有生成呢!所以无论怎么样都出错)。 
 
当然,真正的验证码是可以单击换一张的,这利用了ajax技术。
PHP 用session与gd库实现简单验证码生成与验证的类的更多相关文章
- php中运用GD库实现简单验证码
		
昨天学习了运用php的GD库进行验证码的实现. 首先可以用phpinfo()函数看一下GD库有没有安装,我用的wampserver是自动给安装的. 主要的步骤是: 1.生成验证码图片 2.随机生成字符 ...
 - php中GD库的简单使用
		
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
 - 安装GD库解决ThinkPHP 验证码Call to undefined function Think\imagecreate()出错
		
在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会提示 ...
 - php使用GD库实现图片水印和缩略图——封装成类
		
学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...
 - PHP 使用gd库压缩图片并生成新图片返回全路径
		
使用gd库前,先检查是否开启了gd库 phpinfo(); 如果在php配置信息里找到了gd库,那么就是开启了,没开启的自行百度如何开启php gd库 既然开启了gd库,那么直接再php里写入以下代码 ...
 - 【代码学习】GD库中简单的验证码
		
大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...
 - 【代码总结】GD库中简单的验证码
		
大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...
 - 使用Pillow库 创建简单验证码
		
使用Pillow生成简单的验证码 本想做成字体各自按随机角度倾斜, 但没有在Pillow中找到相关的方法 import randomfrom PIL import Image, ImageDraw, ...
 - 基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲…….)
		
转自:http://www.blhere.com/1168.html 12345678910111213141516171819202122232425262728293031323334353637 ...
 
随机推荐
- 苹果App Store开发者帐户从申请,验证,到发布应用(2)
			
app store付费 上面已经介绍了app store id的注册了,下面在注册基础上,介绍一下app store的付费. 在上面注册成功之后,会收到一封邮件. 1.收到邮件Thank Yo ...
 - Dom编程(二)
			
document是window对象的一个属性,因为使用window对象成员的时候可以省略window.,所以一般直接写document document的方法: (1)write:向文档中写入内容. ...
 - svn 安装网站
			
1.svn插件 http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240
 - js盒子模型
			
1.js盒子模型 指的是通过js中提供的一系列的属性和方法,获取页面中元素的样式信息值 例: #box有很多自己的私有属性: HTMLDivElement.prototype->HTMLElem ...
 - UVa 10258 - Contest Scoreboard
			
题目大意:关于acm竞赛排名的题目,对于参赛者首先按做出的题目排名,然后是罚时,最后是编号. 多关键字域排序问题. #include <cstdio> #include <cstri ...
 - iOS 之 编外知识点
			
iOS 使用github iOS 开源库介绍 iOS 优质方案 iOS 开发framework 后端数据库使用 Bomb方案 iOS 错误及解决汇总 后台 之 Bmob 申请苹果企业账号
 - Django用自定义cookies 实现登录,注册,退出
			
#注册 def regist(req): if req.method == 'POST': uf = UserForm(req.POST) if uf.is_valid(): #获得表单数据 user ...
 - javac不是内部或外部命令
			
1.描述 在命令行输入javac,提示“不是内部或外部命令”. 2.解决过程 2.1.解决方案一 2.1.1.检查并添加环境变量 通常就是这个原因导致. 2.1.2.过程一 确实还是环境变量没有写对. ...
 - Angular  - - ngChange、ngChecked、ngClick、ngDblclick
			
ngChange 当用户更改输入时,执行给定的表达式.表达式是立即进行执行的,这个和javascript的onChange事件的只有在触发事件的变化结束的时候执行不同. 格式:ng-change=”v ...
 - 浅谈JavaWEB入门必备知识之Servlet入门案例详解
			
工欲善其事.必先利其器,想要成为JavaWEB高手那么你不知道servlet是一个什么玩意的话,那就肯定没法玩下去,那么servlet究竟是个什么玩意?下面,仅此个人观点并通过一个小小的案例来为大家详 ...