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中 這個能...