php Captcha验证码类

<?php
/** Captcha 驗證碼類
*   Date:   2011-02-19
*   Author: fdipzone
*/

class Captcha{  //class start  

    private $sname = '';  

    public function __construct($sname=''){ // $sname captcha session name
        $this->sname = $sname==''? 'm_captcha' : $sname;
    }  

    /** 生成验证码图片
    * @param  int   $length 驗證碼長度
    * @param  Array $param  參數
    * @return IMG
    */
    public function create($length=4,$param=array()){
        Header("Content-type: image/PNG");
        $authnum = $this->random($length);   //生成验证码字符.  

        $width  = isset($param['width'])? $param['width'] : 13;     //文字宽度
        $height = isset($param['height'])? $param['height'] : 18;   //文字高度
        $pnum   = isset($param['pnum'])? $param['pnum'] : 100;      //干扰象素个数
        $lnum   = isset($param['lnum'])? $param['lnum'] : 2;        //干扰线条数  

        $this->captcha_session($this->sname,$authnum);                //將隨機數寫入session  

        $pw = $width*$length+10;
        $ph = $height+6;  

        $im = imagecreate($pw,$ph);                     //imagecreate() 新建图像,大小为 x_size 和 y_size 的空白图像。
        $black = ImageColorAllocate($im, 238,238,238);  //设置背景颜色  

        $values = array(
                mt_rand(0,$pw),  mt_rand(0,$ph),
                mt_rand(0,$pw),  mt_rand(0,$ph),
                mt_rand(0,$pw),  mt_rand(0,$ph),
                mt_rand(0,$pw),  mt_rand(0,$ph),
                mt_rand(0,$pw),  mt_rand(0,$ph),
                mt_rand(0,$pw),  mt_rand(0,$ph)
        );
        imagefilledpolygon($im, $values, 6, ImageColorAllocate($im, mt_rand(170,255),mt_rand(200,255),mt_rand(210,255)));   //設置干擾多邊形底圖  

        /* 文字 */
        for ($i = 0; $i < strlen($authnum); $i++){
            $font = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));//设置文字颜色
            $x  = $i/$length * $pw + rand(1, 6);    //设置随机X坐标
            $y  = rand(1, $ph/3);                   //设置随机Y坐标
            imagestring($im, mt_rand(4,6), $x, $y, substr($authnum,$i,1), $font);
        }  

        /* 加入干扰象素 */
        for($i=0; $i<$pnum; $i++){
            $dist = ImageColorAllocate($im, mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //设置杂点颜色
            imagesetpixel($im, mt_rand(0,$pw) , mt_rand(0,$ph) , $dist);
        }   

        /* 加入干擾線 */
        for($i=0; $i<$lnum; $i++){
            $dist = ImageColorAllocate($im, mt_rand(50,255),mt_rand(150,255),mt_rand(200,255)); //設置線顏色
            imageline($im,mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),$dist);
        }  

        ImagePNG($im);      //以 PNG 格式将图像输出到浏览器或文件
        ImageDestroy($im);  //销毁一图像
    }  

    /** 檢查驗證碼
    * @param String $captcha    驗證碼
	* 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/PHP/
    * @param int    $flag       驗證成功后 0:不清除session 1:清除session
    * @return boolean
    */
    public function check($captcha,$flag=1){
        if(empty($captcha)){
            return false;
        }else{
            if(strtoupper($captcha)==$this->captcha_session($this->sname)){   //檢測驗證碼
                if($flag==1){
                    $this->captcha_session($this->sname,'');
                }
                return true;
            }else{
                return false;
            }
        }
    }  

    /* 产生随机数函数
    * @param    int     $length 需要隨機生成的字符串數
    * @return   String
    */
    private function random($length){
        $hash = '';
        $chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZ23456789';
        $max = strlen($chars) - 1;
        for($i = 0; $i < $length; $i++) {
            $hash .= $chars[mt_rand(0, $max)];
        }
        return $hash;
    }  

    /** 驗證碼session處理方法
    * @param    String  $name   captcha session name
    * @param    String  $value
    * @return   String
    */
    private function captcha_session($name,$value=null){
        if(isset($value)){
            if($value!==''){
                $_SESSION[$name] = $value;
            }else{
                unset($_SESSION[$name]);
            }
        }else{
            return isset($_SESSION[$name])? $_SESSION[$name] : '';
        }
    }  

}   // class end
?>

demo

<?
    session_start();
    require_once('Captcha.class.php');  

    $obj = new Captcha($sname);     # 創建Captcha類對象
                                    # $sname為保存captcha的session name,可留空,留空則為'm_captcha'

    $obj->create($length,$param);    # 創建Captcha并輸出圖片
                                    # $length為Captcha長度,可留空,默認為4
                                    /* $param = array(
                                            'width' => 13        captcha 字符寬度
                                            'height' => 18       captcha 字符高度
                                            'pnum' => 100        干擾點個數
                                            'lnum' => 2          干擾線條數
                                            )
                                            可留空
                                    */

    $obj->check($captcha,$flag); # 檢查用戶輸入的驗證碼是否正確,true or false
                                    # $captcha為用戶輸入的驗證碼,必填
                                    # $flag 可留空,默認為1
                                    #       1:當驗證成功后自動清除captcha session
                                    #       0:當驗證成功后不清除captcha session,用於ajax檢查
?>

作者:csdn博客 傲雪星枫

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索csdn
, 验证
, 博客
, demo
, php验证码类
, captcha
, PHP图片验证码类
, 验证码类
作者
php captcha验证码、captcha验证码、captcha验证码不显示、java captcha 验证码、群晖 captcha验证码,以便于您获取更多的相关知识。

时间: 2025-01-21 01:31:15

php Captcha验证码类的相关文章

php实现的Captcha验证码类实例_php技巧

本文实例讲述了php实现的Captcha验证码类,在php程序设计中有着极其广泛的应用.分享给大家供大家参考.具体方法如下: 验证码类文件如下: <?php /** Captcha 验证码类 * Date: 2011-02-19 * Author: fdipzone */ class Captcha{ //class start private $sname = ''; public function __construct($sname=''){ // $sname captcha sessi

php实现的click captcha点击验证码类实例_php技巧

本文实例讲述了php实现的click captcha点击验证码类及其用法,是非常实用的功能.分享给大家供大家参考之用.具体如下: 一.需求: 现在常用的表单验证码大部分都是要用户输入为主,但这样对手机用户会不方便. 如果手机用户访问,可以不用输入,而是click某一位置便可确认验证码,这样就会方便很多. 二.原理: 1.使用PHP imagecreate创建PNG图象,在图中画N个圆弧,其中一个是完整的圆(验证用),将圆心坐标及半径记录入session. 2.在浏览器,当用户在验证码图片上点击时

php封装的验证码类分享

验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位读友. 实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵. 这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前啰嗦一下. 首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正. 1.创建画布函数:imagecreatetruecolor(w,h); 说明:用于创建一个画布. w 画布的宽

PHP编写的图片验证码类文件分享_php实例

适用于自定义的验证码类! <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ Class Image{ private $img; public $width = 85; pub

分享一个漂亮的php验证码类_php技巧

本文实例为大家分享了一个漂亮的php验证码类,供大家参考,具体内容如下 //验证码类 class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 private $width = 130;//宽度 private $height = 50;//高度 privat

PHP实现简单实用的验证码类_php技巧

本文实例讲述了PHP实现简单实用的验证码类.分享给大家供大家参考.具体如下: <?php /** * @version 1.0 * @author bolted snail * @date 2011-10-15 * @PHP验证码类 * 使用方法: * $image=new Captcha(); * $image->config('宽度','高度','字符个数','验证码session索引'); * $image->create();//这样就会向浏览器输出一张图片 * //所有参数都可

PHP学习笔记 用户注册模块用户类以及验证码类_php技巧

所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友. :User类,包括读取和设置数据库,以及保存更改交互 复制代码 代码如下: <?php class User{ private $uid; private $fields; public function __construct(){ $this->uid=null; $this->fields=array('username'=>'','password'=>'','emailAddr'=>''

PHP编写的图片验证码类文件分享

适用于自定义的验证码类! <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ Class Image{ private $img; public $width = 85; pub

PHP验证码类实例

 这篇文章主要介绍了一个好用的PHP验证码类实例,有需要的朋友可以参考一下 分享一个好用的php验证码类,包括调用示例. 说明: 如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下Windows/Fonts.   参考了网上的php 生成验证码的方法,以及php 图片验证码和php 中文验证码的生成方法.用到了PHP GD库的相关知识.   1,生成验证码的类 VerificationCode.cla