在開發留言板或表單系統時,驗證碼是防止垃圾留言與機器人攻擊的關鍵機制。本文將詳細示範如何在 Zend Framework 專案中整合驗證碼功能,包含驗證碼圖片生成、Session 儲存與前後端驗證邏輯,並提供完整的 Demo 原始碼供下載參考。
我們採用外掛模式將驗證碼類別封裝,便於在控制器中重複使用。主要流程分為三個步驟:建立驗證碼外掛類別、在控制器新增生成驗證碼的 Action、於視圖模板嵌入驗證碼圖片與輸入框,最後在表單提交處理中驗證 Session 中的驗證碼值。
在 library/Custom/Controller/Plugin/ 目錄下建立 ImgCode.php,此類別繼承自 Zend_Controller_Plugin_Abstract,負責生成隨機驗證碼字串、繪製干擾線與文字,並將驗證碼值存入 Zend_Session_Namespace('Auth_Code') 中供後續驗證使用。
<?php
class Custom_Controller_Plugin_ImgCode extends Zend_Controller_Plugin_Abstract {
public function image2() {
// 生成隨機驗證碼字串
$randval = $this->rand_string(4, 'mixed');
// 存入 Session
$authCode = new Zend_Session_Namespace('Auth_Code');
$authCode->imagecode = $randval;
// 輸出圖片標頭並繪製驗證碼圖片
header('Content-Type: image/png');
// ... 繪圖邏輯省略 ...
}
// 輔助方法:生成隨機字串
private function rand_string($len, $mode) { /* ... */ }
}
?>
在 IndexController.php 中加入 imgcodeAction(),關閉 ViewRenderer 並實例化外掛類別輸出驗證碼圖片:
<?php
public function imgcodeAction() {
$this->getFrontController()->setParam('noViewRenderer', true);
Zend_Loader::loadClass('Custom_Controller_Plugin_ImgCode');
$imagecode = new Custom_Controller_Plugin_ImgCode();
$imagecode->image2();
}
?>
於 message/index.phtml 表單中加入驗證碼圖片與輸入框,並附上「看不清?換一張」的 JavaScript 切換功能:
<img src="/index/imgcode" id="captchaImg" alt="驗證碼" style="vertical-align:middle;" />
<a href="javascript:void(0);" onclick="document.getElementById('captchaImg').src='/index/imgcode?'+Math.random();">看不清?換一張</a>
<input type="text" name="verifyCode" id="verifyCode" />
在 messageAction() 中比對用戶輸入與 Session 中儲存的驗證碼:
<?php
$authCode = new Zend_Session_Namespace('Auth_Code');
if (strtolower($this->_request->getPost('verifyCode')) != strtolower($authCode->imagecode)) {
$this->view->message = '驗證碼錯誤,請重新輸入!';
return;
}
// 驗證通過,執行留言儲存邏輯
?>
本教學完整專案結構與程式碼已打包,可至 本站下載區 取得 Demo 原始碼,直接部署至伺服器即可運行測試。