基於Zend的Captcha機制的應用

2022-10-06 07:03:08 字數 3491 閱讀 1918

如何生成驗證碼?使用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模組錯誤,請看這篇文章:

生成驗證碼

使用zend_captcha_image類

複製** **如下:

$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這裡有兩個變數需要說一下,$id 和 $code。

檔名就是$id . ".png"; 這個id是乙個隨機數。

$code是這個中的文字,就是驗證碼的答案

2setwordlen 等設定的介面是zend_captcha_image暴露給外面的對驗證碼的設定。其實看函式名也能知道是做什麼的了。具體請參考zend的api手冊。

3font字型檔案必須在伺服器上有,imgdir設定的是生成路徑

驗證驗證碼

好了,生成了驗證碼,現在要驗證驗證碼了。

驗證步驟就需要用到zend_session_namespace這個session儲存模組。

首先,生成驗證碼的時候有id和code兩個變數應該存下來。

好吧,回到上一步,將**進行下修改

複製** **如下:

$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和驗證碼傳遞過去。

讓使用者填寫驗證碼。

第三步,驗證。

驗證這步需要使用者提供兩個引數: $id 和驗證碼答案$code

複製** **如下:

$codesession = new zend_session_namespace('captcha_code_' . $this->_params['id']);

if ($codesession == null || strtolower($codesession->code) != strtolower($this->_params['code']))

這段**讀起來很順口吧:如果captcha_code_$id中有儲存code,並且code和使用者填寫的code一致,那麼就驗證成功。

這樣,驗證碼驗證過程就結束了。

深入考慮

好了,其實驗證碼沒有這麼簡單。下面有幾個問題值得考慮

驗證碼是不會自動刪除的,所以生成的驗證碼所在資料夾體積會不斷增加。怎麼辦?

image類中是提供了方法的$captcha->setgcfreq(5) 。

具體使用方法看api吧

我希望自己設定$id,怎麼辦?

答案是在zend_captche_image上再封裝一層,然後重寫generate()方法

比如我重寫了乙個類:

複製** **如下:

class test_captcha_image extends zend_captcha_image

$this->_generateimage($id, $this->getword());

if (mt_rand(1, $this->getgcfreq()) == 1)

return $id;

} public function setid($id)

}我希望我每個使用者只有乙個驗證碼,這個驗證碼的名稱就是userid.png

那麼使用這個類的**是這樣的

複製** **如下:

$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 = $captwww.cppcns.comcha->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']))

附言zend的captcha是封裝了基本的驗證碼動作。生成簡單的程式設計客棧驗證碼基本是完全不需要看內部的**的了,但如果你需要對驗證碼進行更高階的操作,比如修改驗證碼的顯示文字等,最好就需要將captcha的原始碼看一下了。

本文標題: 基於zend的captcha機制的應用

本文位址: /wangluo/php/94404.html

CaptCha的現狀與未來

有乙個機會,朋友推薦乙個創業的哥們給我認識,方向就是驗證碼識別,當時以各種不明顯的陳述推諉掉,起初是職業道德的約束,到後來才發現,這其實是乙個無比困難的問題。可以利用現有的api很快地做好乙個可以執行的演示程式,但如果要改進,著實困難。什麼是驗證碼 驗證碼 captcha 其實並不是各位總是在不同 ...

CI的captcha替代類庫

ci的captcha使用起來不是特別好用,可以用這個替代類庫 class captcha function showimg function getcaptcha private function createimg private function setdisturb 加入弧線 for i 0 ...

Zend引擎的優化

在php 5.4的更新list上,有一句 提公升了zend引擎的效能,減少了記憶體占用.那麼,到底是怎麼提公升的呢?我們知道在php中,類的屬性 靜態屬性 常量,都是儲存在hashtable中的,而在以前,即使乙個類沒有申明屬性 靜態屬性 常量,zend引擎也會為他們分配hashtable.而在現在...