国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > ThinkPHP > 正文

ThinkPHP表單令牌驗證功能

2024-09-09 15:19:56
字體:
來源:轉載
供稿:網(wǎng)友

ThinkPHP新版內(nèi)置了表單令牌驗證功能,可以有效防止表單的遠程提交等安全防護,表單令牌驗證相關的配置參數(shù)有:

  1. 'TOKEN_ON'=>true,  // 是否開啟令牌驗證 
  2. 'TOKEN_NAME'=>'__hash__',    // 令牌驗證的表單隱藏字段名稱 
  3. 'TOKEN_TYPE'=>'md5',  //令牌哈希驗證規(guī)則 默認為MD5 

如果開啟表單令牌驗證功能,系統(tǒng)會自動在帶有表單的模板文件里面自動生成以TOKEN_NAME為名稱的隱藏域,其值則是TOKEN_TYPE方式生成的哈希字符串,用于實現(xiàn)表單的自動令牌驗證.

自動生成的隱藏域位于表單Form結束標志之前,如果希望自己控制隱藏域的位置,可以手動在表單頁面添加__TOKEN__ 標識,系統(tǒng)會在輸出模板的時候自動替換,如果在開啟表單令牌驗證的情況下,個別表單不需要使用令牌驗證功能,可以在表單頁面添加__NOTOKEN__,則系統(tǒng)會忽略當前表單的令牌驗證.

如果頁面中存在多個表單,建議添加__TOKEN__標識,并確保只有一個表單需要令牌驗證.

模型類在創(chuàng)建數(shù)據(jù)對象的同時會自動進行表單令牌驗證操作,如果你沒有使用create方法創(chuàng)建數(shù)據(jù)對象的話,則需要手動調用模型的autoCheckToken方法進行表單令牌驗證,如果返回false,則表示表單令牌驗證錯誤,例如:

  1. $User = M("User"); // 實例化User對象 
  2. // 手動進行令牌驗證 
  3. if (!$User->autoCheckToken($_POST)){ 
  4. // 令牌驗證錯誤 

在ThinkPHP框架的View.class.php里定義了一個公共的模板替換函數(shù),PHP代碼如下:

  1. protected function templateContentReplace($content) { 
  2.         // 系統(tǒng)默認的特殊變量替換 
  3.         $replace =  array
  4.             '../Public'     => APP_PUBLIC_PATH,// 項目公共目錄 
  5.             '__PUBLIC__'    => WEB_PUBLIC_PATH,// 站點公共目錄 
  6.             '__TMPL__'      => APP_TMPL_PATH,  // 項目模板目錄 
  7.             '__ROOT__'      => __ROOT__,       // 當前網(wǎng)站地址 
  8.             '__APP__'       => __APP__,        // 當前項目地址 
  9.             '__UPLOAD__'    => __ROOT__.'/Uploads'
  10.             '__ACTION__'    => __ACTION__,     // 當前操作地址 
  11.             '__SELF__'      => __SELF__,       // 當前頁面地址 
  12.             '__URL__'       => __URL__, 
  13.             '__INFO__'      => __INFO__, 
  14.         ); 
  15.         if(defined('GROUP_NAME')) 
  16.         { 
  17.             $replace['__GROUP__'] = __GROUP__;// 當前項目地址 
  18.         } 
  19.         if(C('TOKEN_ON')) { 
  20.             if(strpos($content,'{__TOKEN__}')) { 
  21.                 // 指定表單令牌隱藏域位置 
  22.                 $replace['{__TOKEN__}'] =  $this->buildFormToken(); 
  23.             }elseif(strpos($content,'{__NOTOKEN__}')){ 
  24.                 // 標記為不需要令牌驗證 
  25.                 $replace['{__NOTOKEN__}'] =  ''
  26.             }elseif(preg_match('/<//form(/s*)>/is',$content,$match)) { 
  27.                 // 智能生成表單令牌隱藏域 
  28.                 $replace[$match[0]] = $this->buildFormToken().$match[0]; 
  29.             } 
  30.         } 
  31.         // 允許用戶自定義模板的字符串替換 
  32.         if(is_array(C('TMPL_PARSE_STRING')) ) 
  33.             $replace =  array_merge($replace,C('TMPL_PARSE_STRING')); 
  34.         $content = str_replace(array_keys($replace),array_values($replace),$content); 
  35.         return $content
  36.     } 

上面的if(C('TOKEN_ON'))是對令牌驗證的開啟狀態(tài)進行判斷,若開啟則調用buildFormToken()方法,$_SESSION[$tokenName] = $tokenValue; 其實就是給$_SESSION['__hash__']賦值,如果不想進行令牌驗證,只要在頁面的之前加入{__NOTOKEN__}就行了,它會被函數(shù)替換成空.

在ThinkPHP的Model.class.php類里定義了令牌的驗證函數(shù),PHP代碼如下:

  1. // 表單令牌驗證 
  2.         if(C('TOKEN_ON') && !$this->autoCheckToken($data)) { 
  3.             $this->error = L('_TOKEN_ERROR_'); 
  4.             return false; 
  5.         } 
  6.  
  7.   // 自動表單令牌驗證 
  8.     public function autoCheckToken($data) { 
  9.         $name   = C('TOKEN_NAME'); 
  10.         if(isset($_SESSION[$name])) { 
  11.             // 當前需要令牌驗證 
  12.             if(emptyempty($data[$name]) || $_SESSION[$name] != $data[$name]) { 
  13.                 // 非法提交 
  14.                 return false; 
  15.             } 
  16.             // 驗證完成銷毀session 
  17.             unset($_SESSION[$name]); 
  18.         } 
  19.         return true; 
  20.     } 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 江山市| 泽普县| 南开区| 玉树县| 白城市| 美姑县| 天长市| 临高县| 浑源县| 五家渠市| 建瓯市| 堆龙德庆县| 乐陵市| 太康县| 郎溪县| 五莲县| 长宁区| 林西县| 罗城| 靖宇县| 焦作市| 普陀区| 沂源县| 天峻县| 丰原市| 安泽县| 无棣县| 鄂州市| 桂平市| 尼玛县| 株洲县| 灌南县| 沙田区| 麟游县| 电白县| 吴堡县| 寿宁县| 阳东县| 沂南县| 瑞昌市| 二连浩特市|