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() {
// ...
// 使用Model的create函數更安全
$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處理。