ThinkPHP表單令牌驗證功能

2021-06-13 12:17:59 字數 1881 閱讀 6976

thinkphp表單令牌驗證功能

thinkphp新版內建了表單令牌驗證功能,可以有效防止表單的遠端提交等安全防護。

表單令牌驗證相關的配置引數有

'token_on'=>true,  // 是否開啟令牌驗證    

'token_name'=>'__hash__', // 令牌驗證的表單隱藏欄位名稱

'token_type'=>'md5', //令牌雜湊驗證規則 預設為md5

如果開啟表單令牌驗證功能,系統會自動在帶有表單的模板檔案裡面自動生成以token_name為名稱的隱藏域,其值則是token_type方式生成的雜湊字串,用於實現表單的自動令牌驗證。

自動生成的隱藏域位於表單form結束標誌之前,如果希望自己控制隱藏域的位置,可以手動在表單頁面新增__token__ 標識,系統會在輸出模板的時候自動替換。如果在開啟表單令牌驗證的情況下,個別表單不需要使用令牌驗證功能,可以在表單頁面新增__notoken__,則系統會忽略當前表單的令牌驗證。

如果頁面中存在多個表單,建議新增__token__標識,並確保只有乙個表單需要令牌驗證。

模型類在建立資料物件的同時會自動進行表單令牌驗證操作,如果你沒有使用create方法建立資料物件的話,則需要手動呼叫模型的autochecktoken方法進行表單令牌驗證。如果返回false,則表示表單令牌驗證錯誤。例如:

$user = m("user"); // 例項化user物件    

// 手動進行令牌驗證

if (!$user->autochecktoken($_post))

在thinkphp框架的view.class.php裡定義了乙個公共的模板替換函式

protected function templatecontentreplace($content)  

if(c('token_on')) ')) '] = $this->buildformtoken();

}elseif(strpos($content,''))'] = '';

}elseif(preg_match('/<\/form(\s*)>/is',$content,$match))

} // 允許使用者自定義模板的字串替換

if(is_array(c('tmpl_parse_string')) )

$replace = array_merge($replace,c('tmpl_parse_string'));

$content = str_replace(array_keys($replace),array_values($replace),$content);

return $content;

}

上面的if(c('token_on'))是對令牌驗證的開啟狀態進行判斷,若開啟則呼叫buildformtoken()方法,$_session[$tokenname] = $tokenvalue; 其實就是給$_session['__hash__']賦值。如果不想進行令牌驗證,只要在頁面的之前加入就行了,它會被函式替換成空。

在thinkphp的model.class.php類裡定義了令牌的驗證函式

// 表單令牌驗證 

if(c('token_on') && !$this->autochecktoken($data))

// 自動表單令牌驗證

public function autochecktoken($data)

// 驗證完成銷毀session

unset($_session[$name]);

} return true;

}

ThinkPHP表單令牌

如果不設定表單令牌,很容易導致csrf 跨站請求偽造 跨站提交表單。表單令牌是一種非常實用的技術,它在表單的檢視部分生成隨機令牌,預設為隨機的md5串,存在hidden的input中。在表單資料提交前,將提交的資料與session中存放的令牌進行比對,從而判斷是否是跨站提交。thinkphp中開啟表...

驗證 表單令牌

驗證規則支援對表單的令牌驗證,首先需要在你的表單裡面增加下面隱藏域 type hidden name token value 或者 然後在你的驗證規則中,新增 token 驗證規則即可,例如,如果使用的是驗證器的話,可以改為 protected rule name require max 25 to...

thinkphp5表單令牌

考慮安全的問題,在 中加了令牌。下面說一下如何用thinkphp5自帶的令牌去完成。度了一下,也沒寫的比較全的,tp5文件你懂得,不過最後還是依靠文件寫出來的 文件中介紹了好幾種方法,我就不一一講了,我講乙個直接拿來就能用的。不需要額外的模型層和多餘的 廢話不多說,上 前端 插入在form中 這個能...