首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 3.1 內建驗證碼機制:三行代碼快速接入與常見坑點排查

     編輯:PHP 相關知識

ThinkPHP 3.1 內建驗證碼機制:三行代碼快速接入與常見坑點排查

ThinkPHP 3.1 內建 ORG.Util.Image 類別,提供開箱即用的驗證碼產生功能。本文示範最精簡的接入方式,並針對「圖片不顯示」、「輸出亂碼」等高頻問題給出解決方案。

極速接入步驟

1. 控制器新增 verify() 方法

public function verify() {
    import('ORG.Util.Image');
    ob_clean();               // 關鍵:清除先前輸出緩衝,避免圖片損壞
    Image::buildImageVerify(); // 直接輸出驗證碼圖片並寫入 Session
}

2. 視圖模板引入圖片標籤

<img src="__APP__/Index/verify/" 
     onclick="this.src=this.src+'?'+Math.random()" 
     alt="點擊刷新驗證碼" 
     style="cursor:pointer;vertical-align:middle;" />
  • __APP__/Index/verify/ 對應控制器/方法路徑,依實際路由調整。
  • onclick 附加隨機查詢字串,強制瀏覽器重新請求,實現「點擊刷新」。

3. 表單驗證(控制器處理邏輯)

public function login() {
    if (session('verify') !== md5(strtoupper($_POST['verify']))) {
        $this->error('驗證碼錯誤');
    }
    // ... 後續登入邏輯
}

注意:ThinkPHP 3.1 預設將驗證碼以 md5(strtoupper($code)) 存入 Session,驗證時需同樣處理。

高頻問題排查表

現象原因修正
圖片顯示「圖示破損」或空白方法前有 echo、空白行、BOM 或其他輸出在 Image::buildImageVerify() 前加 ob_clean();確保 PHP 標籤前無任何字元
瀏覽器顯示一堆亂碼(二進位內容)未送出 Content-type: image/... 標頭內建方法已自動送標頭;若手動輸出請補 header('Content-type: image/png')
驗證永遠失敗Session 未啟動或跨子域名確認 session_start() 已執行;設定 cookie_domain 共享 Session
字型找不到報錯GD 未支援 FreeType 或字型路徑錯誤安裝 php-gd 並啟用 FreeType;或改用內建點陣字型

客製化驗證碼參數

Image::buildImageVerify() 支援陣列參數覆蓋預設值:

Image::buildImageVerify([
    'length'   => 4,        // 字元長度
    'width'    => 120,      // 圖片寬度
    'height'   => 40,       // 圖片高度
    'fontSize' => 20,       // 字體大小
    'useCurve' => true,     // 是否畫干擾曲線
    'useNoise' => true,     // 是否加干擾點
    'bg'       => [240,240,240], // 背景色 RGB
]);

最佳實踐提醒

  • 驗證碼方法 務必獨立,不要混在其他邏輯(如 display())之前輸出。
  • 生產環境建議改用 Google reCAPTCHA v3 或 滑動拼圖,兼顧安全與體驗。
  • 若專案已升級 ThinkPHP 5/6,請改用 think-captcha 擴充包,用法類似但命名空間不同。

掌握上述要點,即可在 ThinkPHP 3.1 專案中穩定接入驗證碼,有效阻擋機器人暴力提交。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved