麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > ThinkPHP > 正文

ThinkPHP表單令牌驗證功能

2024-09-09 15:19:56
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

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

  1. protected function templateContentReplace($content) { 
  2.         // 系統默認的特殊變量替換 
  3.         $replace =  array
  4.             '../Public'     => APP_PUBLIC_PATH,// 項目公共目錄 
  5.             '__PUBLIC__'    => WEB_PUBLIC_PATH,// 站點公共目錄 
  6.             '__TMPL__'      => APP_TMPL_PATH,  // 項目模板目錄 
  7.             '__ROOT__'      => __ROOT__,       // 當前網站地址 
  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'))是對令牌驗證的開啟狀態進行判斷,若開啟則調用buildFormToken()方法,$_SESSION[$tokenName] = $tokenValue; 其實就是給$_SESSION['__hash__']賦值,如果不想進行令牌驗證,只要在頁面的之前加入{__NOTOKEN__}就行了,它會被函數替換成空.

在ThinkPHP的Model.class.php類里定義了令牌的驗證函數,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.     } 

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

圖片精選

主站蜘蛛池模板: 日韩深夜视频 | 黄色a级片视频 | 九九久久视频 | 国产二区三区在线播放 | 精品免费在线视频 | 一本免费视频 | 色网免费观看 | 深夜福利久久久 | 爱高潮www亚洲精品 chengrenzaixian | 毛片免费大全短视频 | 激情视频免费观看 | 成人福利视频导航 | 欧美另类69xxxxx 视频 | 麻豆视频在线免费观看 | 末成年女av片一区二区 | 久久精品视频16 | 成人福利电影在线观看 | 精品久久久久久久久中文字幕 | 中国av免费在线观看 | 亚洲啊v在线观看 | 黄污在线看| 毛片a级毛片免费播放100 | 曰本三级日本三级日本三级 | 久久精品亚洲精品国产欧美kt∨ | 激情小说激情图片激情电影 | 色淫视频 | 91精选视频在线观看 | 黄网站在线免费 | 天天碰天天操 | 最新一级毛片 | 一级黄色免费电影 | 色淫影院| 午夜精品老牛av一区二区三区 | 久草视频2| 成年人黄色片视频 | 超碰97国产在线 | jizzyouxxxx| 免费在线观看国产精品 | 毛片在线免费观看网址 | 婷婷久久综合九色综合色多多蜜臀 | 国产88久久久国产精品免费二区 |