Zend的Captcha机制

简介:

如何生成验证码图片?使用php的GD? ok,right。其实Zend的Captcha模块已经封装好了。这篇文章就说一下如何使用Zend的Captcha模块。

 

环境安装

首先Zend的Captcha需要安装GD。查看有没有安装GD需要去phpinfo()中看是否有GD模块。(注意,有可能出现php -m里面的模块有gd但phpInfo()里面的模块没有gd,这个问题是说明你的PHP和Apache没有安装对。具体请去google之)

(如果在安装gd的过程中提示Missing Dependency: libt1.so.5模块错误,请看这篇文章:http://www.siutung.org/post/730/

 

生成验证码图片

使用Zend_Captcha_Image类

1
2
3
4
5
6
7
8
9
10
11
$captcha =  new  Zend_Captcha_Image();
$captcha->setWordLen( '4' )
     ->setHeight( '60' )
     ->setFont(NCHANNEL_FONT_DIR .  '/arial.ttf' )
     ->setImgDir(NCHANNEL_CAPTCHA_DIR)
     ->setDotNoiseLevel( '5' )
     ->setLineNoiseLevel( '5' );
 
$id = $captcha->generate();
 
$code = $captcha->getWord();

 

1 这里有两个变量需要说一下,idid和code。

图片文件名就是$id . ".png"; 这个id是一个随机数。

$code是这个图片中的文字,就是验证码的答案

2 setWordLen 等设置的接口是Zend_Captcha_Image暴露给外面的对验证码图片的设置。其实看函数名也能知道是做什么的了。具体请参考Zend的Api手册。

3 font字体文件必须在服务器上有,ImgDir设置的是图片生成路径

 

验证验证码图片

好了,生成了验证码图片,现在要验证验证码了。

验证步骤就需要用到Zend_Session_Namespace这个session存储模块。

 

首先,生成验证码的时候有id和code两个变量应该存下来。

好吧,回到上一步,将代码进行下修改

1
2
3
4
5
6
7
8
9
10
11
12
$captcha =  new  Zend_Captcha_Image();
$captcha->setWordLen( '4' )
     ->setHeight( '60' )
     ->setFont(NCHANNEL_FONT_DIR .  '/arial.ttf' )
     ->setImgDir(NCHANNEL_CAPTCHA_DIR)
     ->setDotNoiseLevel( '5' )
     ->setLineNoiseLevel( '5' );
 
$id = $captcha->generate();
$codeSession =  new  Zend_Session_Namespace( 'captcha_code_'  . $id);
 
$codeSession->code = $captcha->getWord();

 

这里看到,我们使用captcha_code_id将code存储下来。目的是等到验证步骤的时候使用。

第二步

给页面传递表单的时候把$id和验证码图片传递过去。

让用户填写验证码。

第三步,验证。

验证这步需要用户提供两个参数: idid和验证码答案code

1
2
3
4
5
$codeSession =  new  Zend_Session_Namespace( 'captcha_code_'  . $ this ->_params[ 'id' ]);
if  ($codeSession ==  null  || strtolower($codeSession->code) != strtolower($ this ->_params[ 'code' ])) {
     $ this ->Output(ERROR);
 
}

 

这段代码读起来很顺口吧:如果captcha_code_$id中有保存code,并且code和用户填写的code一致,那么就验证成功。

 

这样,验证码验证过程就结束了。

 

深入考虑

好了,其实验证码没有这么简单。下面有几个问题值得考虑

验证码图片是不会自动删除的,所以生成的验证码图片所在文件夹体积会不断增加。怎么办?

Image类中是提供了方法的$captcha->setGcFreq(5) 。

具体使用方法看API吧

 

我希望自己设置$id,怎么办?

答案是在Zend_Captche_Image上再封装一层,然后重写generate()方法

 

比如我重写了一个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class  Test_Captcha_Image extends Zend_Captcha_Image
{
     protected  $_fid =  "" ;
     
     public  function generate()
     {
         $word = $ this ->_generateWord();
         $ this ->_setWord($word);
         if  ($ this ->_fid) {
             $id = $ this ->_fid;
         }
         $ this ->_generateImage($id, $ this ->getWord());
 
         if  (mt_rand(1, $ this ->getGcFreq()) == 1) {
             $ this ->_gc();
         }
         return  $id;
     }
     
     public  function setId($id) {
         $ this ->_fid = $id;
         return  $ this ;
     }
}

我希望我每个用户只有一个验证码,这个验证码的图片名称就是userid.png

 

那么使用这个类的代码是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$captcha  new  Test_Captcha_Image();
$captcha ->setWordLen( '4' )
     ->setHeight( '60' )
     ->setFont(NCHANNEL_FONT_DIR .  '/arial.ttf' )
     ->setImgDir(NCHANNEL_CAPTCHA_DIR)
     ->setDotNoiseLevel( '5' )
     ->setLineNoiseLevel( '5' )
     ->setId( $user_id );
 
$id  $captcha ->generate();
$codeSession  new  Zend_Session_Namespace( 'captcha_code_'  $user_id );
$codeSession ->code =  $captcha ->getWord();
 
-------------- 
// 验证session
$codeSession  new  Zend_Session_Namespace( 'captcha_code_'  $this ->_params[ 'user_id' ]);
if  ( $codeSession  == null ||  strtolower ( $codeSession ->code) !=  strtolower ( $this ->_params[ 'code' ])) {
     $this ->Output(ERROR);
}

 

附言

Zend的Captcha是封装了基本的验证码动作。生成简单的验证码基本是完全不需要看内部的代码的了,但如果你需要对验证码进行更高级的操作,比如修改验证码的显示文字等,最好就需要将Captcha的源码看一下了。

目录
相关文章
|
7月前
|
缓存 PHP 开发者
PHP中的自动加载机制及其优化方法
传统的PHP开发中,经常会遇到类文件加载繁琐、效率低下的情况,而PHP的自动加载机制能够很好地解决这一问题。本文将深入探讨PHP中的自动加载机制,介绍其原理及实现方式,并提出了一些优化方法,帮助开发者提升代码加载效率,提高应用性能。
|
6月前
|
前端开发 PHP
laravel 使用captcha库生成验证码的方法
laravel 使用captcha库生成验证码的方法
53 0
|
安全 PHP
PHP - Laravel 表单验证(验证规则与使用 $this->validate()、Validator::make()、Requests)
PHP - Laravel 表单验证(验证规则与使用 $this->validate()、Validator::make()、Requests)
263 0
|
存储 NoSQL Java
php中session原理详解
SESSION:服务器端的会话技术。为每一个访问者创建唯一的id(UID)(而且同一用户不同的浏览器也会生成不同的UID),并基于这个id(UID)来存储变量; UID存储在cookie中,亦或者通过URL进行传导;
191 0
|
存储 SQL 安全
PHP中的session安全吗?底层原理是什么?
PHP中的session安全吗?底层原理是什么?
141 0
PHP:firebase/php-jwt生成jwt和验证
PHP:firebase/php-jwt生成jwt和验证
383 0
|
PHP 数据安全/隐私保护
laravel 5.6 登录验证码 captcha 引入
用户登陆注册, 不管前台后台, 如果掌握了手机短信和图形验证码, 那安全性会好很多, PHP上常见有两个captcha图形验证方式, gregwar/captcha和mews/captcha 参考下面的连接,用mews/captcha,感觉很方便。
6681 0