PHP表單令牌設計

2021-06-18 17:55:53 字數 2029 閱讀 2496

php token(令牌)設計 設計目標: 避免重複提交資料. 檢查來路,是否是外部提交 匹配要執行的動作(如果有多個邏輯在同乙個頁面實現,比如新增,刪除,修改放到乙個php檔案裡操作) 這裡所說的token是在頁面顯示的時候,寫到form的乙個隱藏表單項(type=hidden). token不可明文,如果是明文,那就太危險了,所以要採用一定的加密方式.密文要可逆.俺演算法很白痴,所以採用了網上乙個現成的方法.

如何達到目的: 

怎樣避免重複提交? 

在session裡要存乙個陣列,這個陣列存放以經成功提交的token.在後台處理時,先判斷這個token是否在這個陣列裡,如果存在,說明是重複提交.  

如何檢查來路? 

可選項,這個token在生成的時候,加入了當前的session_id.如果別人copy你的html(token一迸copy),在提交時,理論上token裡包含的session_id不等於當前session_id,就可以判斷這次提交是外部提交.  

如何匹配要執行的動作? 

在token的時候,要把這個token的動作名稱寫進這個token裡,這樣,在處理的時候,把這個動作解出來進行比較就行了. 

我以前寫的gtoken不能達到上面所說的第二條,今天修改了一下,把功能2加上了.個人感覺還行. 

請大家看**,感覺**有不合理的地方,還請賜教!謝謝. 

加密我是找的網上的乙個方法,稍作了一下修改. 

gencrypt.inc.php: 

<?php  

class gencrypt extends gsuperclass

return $tokens;

} /**

* 產生乙個新的token

* * @param string $formname

* @param 加密金鑰 $key

* @return string

*/

public static function grantetoken($formname,$key = gconfig::encrypt_key )

/**

* 刪除token,實際是向session 的乙個陣列裡加入乙個元素,說明這個token以經使用過,以避免資料重複提交。

* * @param string $token

*/

public static function droptoken($token)

/**

* 檢查是否為指定的token

* * @param string $token 要檢查的token值

* @param string $formname

* @param boolean $fromcheck 是否檢查來路,如果為true,會判斷token中附加的session_id是否和當前session_id一至.

* @param string $key 加密金鑰

* @return boolean

*/

public static function istoken($token,$formname,$fromcheck = false,$key = gconfig::encrypt_key)

} ?>

示例: 

首先從$_post裡取出token,用istoken判斷. 

這一切看著似乎是沒有問題了. 

如果想判斷是否是執行的匹配動作,可以把istoken裡的formname改一下,執行,很好,沒有匹配上.證明這個成功. 

是否能避免重複提交,我沒有驗證,太簡單的邏輯了. 

餘下的就是判斷 來路檢查 是否正常工作了. 

把上面的示例產生的html copy到本地的乙個網頁內(以達到不同的域的目的),執行,檢查來路不明,沒有執行動作(需要把istoken的第三個引數設為true). 

把istoken的第三個引數設定為false,提交,指定的動作執行了! 

好了,到此為止,不知道哪個地方是否還存在bug,這就要在長期運用中慢慢除錯修改了! 

ThinkPHP表單令牌

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

eyoucms表單令牌

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

驗證 表單令牌

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