PHP 验证码:扭曲+粘连+变形

一,绪论

  由于项目需要,需要加强目前的验证码,我们参照的对象是支付宝。

  基于PHP CodeIgniter 框架,代码放置在下面的路径下。

/application/libraries

二,主要代码

class VerifyCode
{

    //声明图像大小
    private $width = 78;
    private $height = 46;

    //验证码字符有限集
    private $v_char = ‘1234567890‘;
    private $v_code_str = ‘‘;

    //验证码数量
    private $v_num = 4;

    // 第i个文字x轴起始位置计算公式: x轴起始坐标 = margin + padding * i
    //文字内外边距
    private $padding = 15;
    private $margin = 3;

    //字体大小
    private $font_size = 30;

    //字体逆时针旋转的角度
    private $font_angles = array(-5, 5);

    //字体名称
    //private $font = ‘Wattauchimma.ttf‘;
    private $font = ‘msyh.ttf‘;    //加上路径非常重要

    //图像容器
    private $img;

    //颜色容器
    private $colors = array();

    /**
     * 生成图片验证码主逻辑
     * @author 冯煜博
     */
    public function __construct()
    {
        //生成一幅图像
        $this->img = imagecreate($this->width, $this->height);

        //生成颜色
        $this->colors[‘white‘] =  imagecolorallocate($this->img, 255,255,255);
        $this->colors[‘blue‘] =  imagecolorallocate($this->img, 0, 47, 167);

        // 生成纯白色背景
        imagecolorallocate($this->img, 255,255,255); 

        // 设置GD库环境变量
        putenv(‘GDFONTPATH=‘ . realpath(‘.‘));

        //生成验证码字符
        $this->randomContent();
    }

    /**
     * 输出验证码,返回值是验证码的字符串表示
     * @author 冯煜博
     * @return string
     */
    public function show()
    {
        $this->generate();

        header(‘Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate‘);
        header(‘Cache-Control: post-check=0, pre-check=0‘, false);
        header(‘Pragma: no-cache‘);
        header("content-type: image/png");

        ImagePNG($this->img);
        ImageDestroy($this->img);

        return $this->v_code_str;
    }

    /**
     * 生成随机的验证码的内容
     * @author 冯煜博
     * @return string
     */
    private function randomContent()
    {
        for($i = 0; $i < $this->v_num; $i++)
        {
            $this->v_code_str .= $this->v_char[ rand(0, strlen($this->v_char) - 1)];
        }
    }

    /**
     * 生成验证码的图像
     * @author 冯煜博
     */
    private function generate()
    {
        //生成验证码的算法
        for($i = 0; $i < $this->v_num; $i++)
        {
            // 下一个字符的起始x轴坐标
            $x = $this->margin + $this->padding * $i;
            // 下一个字符的起始y轴坐标
            $y = 38;                     

            imagettftext(
                $this->img,
                $this->font_size,
                $this->font_angles[ rand(0, count($this->font_angles) - 1) ],
                $x, $y,
                $this->colors[‘blue‘],
                APPPATH.‘libraries/‘.$this->font,    //加上了字体的相对路径
                $this->v_code_str[ $i ]
            );
        }

        $dst = imagecreatetruecolor($this->width, $this->height);
        $dWhite = imagecolorallocate($dst, 255, 255, 255);
        imagefill($dst,0,0,$dWhite);

        //扭曲,变形
        for($i = 0; $i < $this->width; $i++)
        {
            // 根据正弦曲线计算上下波动的posY  

            $offset = 4; // 最大波动几个像素
            $round = 2; // 扭2个周期,即4PI
            $posY = round(sin($i * $round * 2 * M_PI / $this->width ) * $offset); // 根据正弦曲线,计算偏移量  

            imagecopy($dst, $this->img, $i, $posY, $i, 0, 1, $this->height);
        } 

        $this->img = $dst;
    }

    public function __destruct()
    {
        unset($this->colors);
    }
}

三,CI 框架内的写法

  比如在 VCode 控制器内的 show 方法中,调用:

class VCode extends CI_Controller
{
    /*
     *    显示验证码的网页实际上是异步进行加载的,也就是先后发起两次请求。
     *    第一次加载HTML页面;
     *    第二次加载图片
     */
    public function show()
    {

        $this->load->library(‘VerifyCode‘);

        $this->load->library(‘session‘);
        $this->session->set_flashdata(‘vcode‘, $this->verifycode->show());

        //session_start();
        //$_SESSION[‘vcode‘] = $this->verifycode->show();
    }

}

四,THML调用代码

  我们知道,只要访问 {$domain}index.php/vcode/show 就可以看到一张验证码图片。

  所以在HTML的 img src属性中填写上面的URL就可以。    

<html>
<body>

    <img src="index.php/vcode/show" />

    <br/>

    <?php echo form_open(‘vcode/verify‘) ?>
        <input name="codeStr" />
        <input type="submit" name="submit" value="verify" />
    </form>

</body>
</html>

 五,生成的验证码效果图

时间: 2024-10-06 17:03:53

PHP 验证码:扭曲+粘连+变形的相关文章

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

验证码的认识和简单验证码的攻防

验证码(CAPTCHA)一词,几乎是上网的人都接触过.通俗地将,验证码就是一种把坐在电脑前的人类与机器区分开来的测试,也算是一种最常见反图灵测试.一般来说,验证码由计算机生成,服务器端的计算机知道答案,但在网线这端,应该只有用户(即真正的人)知道答案,而计算机不知道. 从上面的定义里,易得: 验证码应该是不易被计算机识别或破解出来的,如果用简单的算法,也能得到极高的破解率(大于或接近于75%),则这个验证码不算一个合格的验证码. 要攻破验证码,最好的方法应该是机器学习,因为这个方法能让计算机模拟

验证码识别记录

研究了2天的验证码识别,虽然没有成功,但是从中还是收获了不少,这里记录一下,方便以后继续. 首先看图片:   我就是被这种"简单"的验证码给欺骗了,没有干扰,不用去噪点,看起来一切是那么的容易,三下五除二的批量下载了验证码,然后将图片切割开,就准备开始进行特征提取.训练及识别了. 最开始采用的方式是直线碰撞法,即随机在图片上生成若干直线,计算直线与字符的碰撞数量,以这个碰撞数量作为特征值,然后才用ANN神经网络进行训练和识别,最终的结果是,90%的字符被识别为了f(这个验证码的f变形太

Windows Store App 变形特效

在应用程序的开发过程中,为了让界面按照期望的效果显示,有时会对界面元素应用变形特效,例如图片的缩放.旋转.移动等.与3D特效不同,在界面元素实现变形特效之后,其平行关系不会发生改变,只不过是位置.大小或方向发生了改变. 变形特效由界面元素的RenderTransform属性提供支持,此属性是Transform类型的属性, TranslateTransform.RotateTransform.ScaleTransform等都继承自Transform类,通过将它们赋值给RenderTransform

【字源大挪移—读书笔记】 第二部分:字根

[2] 字根:[2.1]表示[否定]的字根.[2.2]表示[方位]的字根.[2.3]表示[程度]的字根.[2.4]表示[状态]的字根.[2.5]表示[现象]的字根.[2.6]表示[身体]的字根.[2.7]表示[姿势]的字根.[2.8]表示[心,心里活动]的字根.[2.9]表示[行为动作]的字根.[2.10]表示[感官动作]的字根.[2.11]表示[感觉]的字根.[2.12]表示[生命]的字根.[2.13]表示[死亡]的字根.[2.14]表示[社会]的字根 [2.1]表示[否定]的字根 -neg-

Distinctive Image Features from Scale-Invariant Keypoints(个人翻译+笔记)-介绍

Distinctive Image Features from Scale-Invariant Keypoints,这篇论文是图像识别领域SIFT算法最为经典的一篇论文,导师给布置的第一篇任务就是它.网上找了好多找不到中译本,那就自己动手丰衣足食吧,顺便造福后人,花时间翻译啃下来并做一个笔记在这吧. ---------------------------------------------------------------------------------------------------

各种图(流程图,思维导图,UML,拓扑图,ER图)简介

来源于:http://www.cnblogs.com/jiqing9006/p/3344221.html 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有广泛的应用. 2.案例 3.计算机语言只是一种工具.光学习语言的规则还不够,最重要的是学会针对各种类型的问题,拟定出有效的解决方法和步骤即算法.有了正确而有效的算法,可以利用任何一种计算机高级语言编写程序,使计算机进行工作.因此,设计算法是程序设计的核心. 对同一个问题,可以有不同的解题方法和步骤.

阿诺德论数学教育

数学是物理的一部分.物理学是一门实验科学,它是自然科学的一部分.而数学是 物理学中只需要花费较少的代价进行实验的那一部分.例如 Jacobi 恒等式(保证三角形三条高交于一点)就是一个实验事实,正如同地球是圆的(即同胚于球体)这样的事实一样.但是发现前者却要比发现后者需要较少的代价. 在20世纪中叶,人们试图严格地区分物理与数学.其造成地后果是灾难性的.整整一代的数学家在对他们所从事的科学的另一半及其无知的情况下成长,当然,对其他的科学就更无知了.这些人又开始把他们的丑陋的学院式的伪数学教给他们

判僭芡铝挖l21sgbzd3jn0h3ws3e0

"姐姐."霍雨浩一眼就看到了平躺在万载寒玉床上的马小桃,急切的就要冲过去,却被玄老一把拉住了."好,天灵高级魂师学院的队员们已经登场了.在这万众瞩目的时刻,下面,让我们有请大陆第一学院,学院中真正的王者,史莱克学院代表队登场."主持者高亢的声音直刺云端,星罗广场内顿时变成了一片欢呼着史莱克的海洋.就连端坐于城头之上观战的星罗帝皇都忍不住站起身来,脸上也流露出了激动之色.又有谁知道,当年他还是皇子的时候曾经化名在史莱克学院中学习过呢?直到现在,他心中还是深深的爱着一个