ThinkPHP框架總結之安全及使用

ThinkPHP框架總結之安全及使用:

 

本片文章主要總結和介紹了使用TP過程中,加強項目安全的一些辦法,具體是以例子爲導向驗證演示。

 

防止SQL注入:

針對WEB應用,防止SQL注入是首要考慮的安全問題,通常的安全隱患在於查詢條件使用字符串參數,而且其中一些參數依賴於客戶端輸入,爲了有效防止SQL注入,這裏建議:

1、查詢條件儘量使用數組方式,具體如下:

數組方式:

$wheres = array();

$wheres['account'] = $account;

$wheres['password'] = $password;

$User->where($wheres)->find();

2、如果必須使用字符串,那麼建議使用預處理機制,具體如下:

$User = D('UserInfo');

$User->where('account="%s" andpassword="%s"',array($account,$password))->find();

3、可以使用PDO方式(綁定參數),因爲這裏未使用PDO,所以不羅列,感興趣的讀者可查詢資料瞭解驗證。

 

表單令牌驗證:

TP框架支持對錶單進行令牌驗證功能,可以有效防止重複提交表單等安全問題。

 

1、如何啓用表單令牌驗證(默認是關閉的)

配置參數:

/* 表單令牌 */

    'TOKEN_ON' => true,//是否開啓令牌驗證

     'TOKEN_NAME' => '__hash__', // 令牌驗證的表單隱藏字段名稱

     'TOKEN_TYPE' => 'md5', // 令牌哈希驗證規則默認爲MD5

     'TOKEN_RESET' => true//令牌驗證出錯後是否重置令牌默認爲true

這代表已經打開了表單令牌驗證的開關,具體可查看註釋說明。此時系統會自動在帶有表單請求的模版文件中自動生成以TOKEN_NAME爲名字的隱藏域,它的值是以TOKEN_TYPE規則的哈希字符串,用來實現表單的令牌驗證。

注意:

如果模版文件中有多個表單,建議添加標誌,只爲需要驗證的表單進行驗證,如果不希望在某個頁面表單驗證,那麼可以在控制器方法的輸出語句前添加關閉驗證表單命令:

C(“TOKEN_ON”,false);

$this->display();

2、表單令牌行爲綁定

我的項目應用配置目錄下,新建一tags.PHP文件,其中內容如下:

<?php

 return array(

           // 靜態緩存寫入時(行爲綁定)

           'view_filter' => array('Behavior\TokenBuild'),

           // 如果是3.2.1以上版本需要改成

           // 'view_filter' =>array('Behavior\TokenBuildBehavior'),

 );

 ?>

存放位置:Project/Common/Conf/tags.php,代表執行到view_filter標籤時執行表單令牌驗證功能。

 

前端輸入過濾:

客戶端提交的數據存在不安全性,所以TP後臺接口必須對提交的數據進行過濾,下面提供幾點建議:

1、使用系統建議的I函數獲得用戶輸入數據

2、開啓表單令牌驗證功能,如上表單令牌使用介紹

3、使用安全過濾函數,例如:stripslashes,htmlentities及strips_tags等

 

使用I函數過濾:

默認全局過濾->

/* 輸入過濾 */

'DEFAULT_FILTER'=> 'strip_tags,stripslashes', // 全局的I函數過濾規則多個

個別數據過濾->

$account = I('post.account','','strip_tags');     //strip_tags過濾$_POST['account']

$password = I('post.password','','stripslashes'); //stripslashes過濾$_POST['password']

 

寫入數據過濾:

如果沒有使用I函數對數據過濾,那麼可以在模型插入數據時過濾,具體如下:

$this->data($data)->filter('strip_tags')->add();

 

目錄文件安全:

由於某些服務器開啓了目錄瀏覽權限,所以任何人都可以直接在瀏覽器中打開並訪問對應目錄,當然,系統默認開啓了目錄文件安全機制,會在自動生成目錄時生成index.html空文件(默認名字,可以使用預定義語句:define(‘DIR_SECURE_FILENAME)’,’default.html’)設置名稱),另外,還支持多個安全文件寫入,用來滿足不同服務器部署的要求(define(‘DIR_SECURE_FILENAME’,’index.html,index.htm’))。

注意:默認生成的安全文件中的內容爲空字符串,我們可以設定默認的值,使用預定義語句:define(‘DIR_SECURE_CONTENT’,’Hello Secure file!’)。

 

表單合法性檢測:

處理表單提交數據時,我們建議使用Think\Model類中的create方法創建數據對象,因爲使用該方法時,系統會對數據的合法性進行檢查。

1、配置insertFields和updateFields屬性

class UserInfoModelextendsModel {

     // 數據表名字

     protected $tureTableName ='user_info';

    

     // 配置插入和修改的字段匹配設置(針對表單)

     protected $insertFields =array('account','nickname','mobile');

     protected $updateFields =array('nickname','mobile');

}

上面的定義之後,當我們使用了create方法創建數據對象後,再使用add方法插入數據時,只會插入上面配置的幾個字段的值(更新類同),具體如下:

接口代碼:

// 用戶註冊(示意性接口:插入)

     public function register() {

          // ...

          // 使用Modelcreate函數更安全

          $User= D('UserInfo');

          $User->create();

          $ID= $User->add();

          if($ID) {

               $result= $User->where('id=%d',array($ID))->find();

               echo json_encode($result);

          }

          // ...

     }

 

返回結果:

 

2、使用field方法直接處理

// 插入

M('User')->field('account,nickname,mobile')->create();

// 更新

M('User')->field('nickname,mobile’)->create();

 

上傳文件安全:

Web網站上傳文件存在安全隱患,所以需要對其進行安全檢查和設置。系統TP提供的Think\Upload提供了對文件的類型、後綴、大小及上傳文件的合法進行了檢查,那麼接下來需要確認相關的配置已經到位(後面總結文件上傳時會詳細介紹)。

 

 

防止XSS攻擊:

XSS,跨站腳本攻擊,可用於竊取其他用戶的Cookie信息,要避免此類問題,可以採用如下解決方案:

• 直接過濾所有的JavaScript腳本;

• 轉義Html元字符,使用htmlentities、htmlspecialchars等函數;

• 系統的擴展函數庫提供了XSS安全過濾的remove_xss方法;

注意:新版對URL訪問的一些系統變量已經做了XSS處理。

發佈了2 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章