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

ThinkPHP create() 方法與表單令牌驗證實戰解析

     編輯:PHP 綜合知識

ThinkPHP 的 `create()` 方法整合了資料物件映射、自動驗證、自動填充、自動完成(三大自動)與 **令牌驗證**,是表單處理的核心安全機制。本文透過實例說明運作流程與模板配合要點。

create() 核心功能

  • 自動獲取 `$_POST`/`$_GET` 資料映射到模型屬性。
  • 執行模型定義的驗證規則(`_validate`)。
  • 執行自動填充規則(`_auto`:時間、IP、加密等)。
  • 自動令牌驗證:檢查表單隱藏欄位 `__hash__` 是否匹配 Session,防止 CSRF 與重複提交。
  • 成功回傳資料陣列,失敗回傳 `false` 並可用 `getError()` 取得錯誤訊息。

控制器範例

class IndexAction extends Action {
    public function add() {
        $user = M('User'); // 實例化模型
        if ($data = $user->create()) {
            // 驗證通過、令牌有效、自動填充完成
            // $data 包含處理後的資料陣列
            // 可直接 $user->add($data) 寫入資料庫
            $this->success('資料建立成功', '__URL__/index');
        } else {
            // 驗證失敗或令牌錯誤
            $this->error($user->getError());
        }
    }
}

模板表單關鍵點

<form action="__URL__/add" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <!-- 必須包含令牌隱藏欄位,框架自動生成 -->
    <input type="hidden" name="__hash__" value="{$Think.__hash__}" />
    <input type="submit" value="提交" />
</form>

⚠️ 若模板缺少 `__hash__` 欄位,`create()` 會直接返回 `false`,錯誤訊息通常為「表單令牌錯誤」。

令牌驗證原理與配置

  • 表單生成時,框架在 Session 存入隨機雜湊值,並寫入隱藏欄位 `__hash__`。
  • 提交時 `create()` 比對 `$_POST['__hash__']` 與 Session 值,並檢查是否過期(預設不限次數,可配置 `TOKEN_RESET`)。
  • 可在配置或模型設定 `TOKEN_ON => true` 強制開啟(預設開啟),`TOKEN_NAME => '__hash__'` 自訂欄位名,`TOKEN_TYPE => 'md5'` 自訂雜湊演算法。
  • 若需關閉特定動作驗證,模型加 `protected $token = false;` 或控制器 `$user->token = false;`。

常見問題排查

善用 `create()` 內建的令牌與驗證機制,能以最少程式碼構建安全可靠的表單處理流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
create() 一直回傳 false模板缺少 __hash__ 欄位加入 <input type="hidden" name="__hash__" value="{$Think.__hash__}" />
AJAX 提交令牌失效Session 未共用或令牌未更新回傳新令牌給前端,或關閉 AJAX 動作驗證
重複提交未攔截TOKEN_RESET 未開啟配置 'TOKEN_RESET' => true 或模型 $token = ['reset' => true]