多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > ThinkPHP > ThinkPHP3.1快速入門(16)安全

ThinkPHP3.1快速入門(16)安全

來源:程序員人生   發(fā)布時(shí)間:2014-02-04 05:45:16 閱讀次數(shù):3955次
在開發(fā)過程中,除了確保業(yè)務(wù)邏輯沒有安全隱患外,應(yīng)該充分了解和利用框架內(nèi)建的安全機(jī)制或者工具來確保應(yīng)用以及服務(wù)器的安全性,下面我們總結(jié)下ThinkPHP中涉及到的安全機(jī)制。

系統(tǒng)安全

系統(tǒng)安全指ThinkPHP可以配合的服務(wù)器的安全部署策略。

應(yīng)用部署建議

首先,我們建議在條件允許的情況下,把框架目錄和項(xiàng)目目錄都部署在非WEB訪問目錄下面,ThinkPHP的訪問機(jī)制完全支持框架和項(xiàng)目的非WEB目錄訪問,你只需要把入口文件和資源(主要是指JS、樣式和圖片文件)目錄放置于WEB目錄下面即可。因此,建議的部署目錄如下:
index.php 項(xiàng)目入口文件
Public/ 項(xiàng)目資源文件目錄
    Js/ JS目錄
    Css/ 樣式文件目錄
    Images/  圖像文件目錄
protected/ (受保護(hù)的目錄,可以部署到非WEB目錄或者設(shè)置安全訪問)
    ThinkPHP/ 框架系統(tǒng)目錄
    App/ 項(xiàng)目目錄
    Uploads/ 項(xiàng)目上傳目錄

系統(tǒng)安全設(shè)置

如果你已經(jīng)通過部署策略設(shè)置了系統(tǒng)目錄安全訪問的話,則可以跳過這段。
如果你無法完全做到上述的服務(wù)器目錄安全保護(hù),也無需擔(dān)心,ThinkPHP仍然可以通過設(shè)置確保你的目錄安全??蚣艿暮诵奈募旧硪呀?jīng)做了訪問判斷,所有核心文件均不能直接在URL中被訪問,因此也不用擔(dān)心直接訪問某些文件導(dǎo)致的錯(cuò)誤暴露你的服務(wù)器路徑之類的信息。
對(duì)于應(yīng)用目錄,系統(tǒng)則提供了目錄安全訪問機(jī)制,你可以在第一次生成項(xiàng)目目錄結(jié)構(gòu)之前,在入口文件中添加:
define('BUILD_DIR_SECURE', true);
運(yùn)行項(xiàng)目后會(huì)自動(dòng)給項(xiàng)目的相關(guān)目錄生成目錄安全文件(在相關(guān)的目錄下面生成空白的htm文件),并且可以自定義安全文件的文件名 DIR_SECURE_FILENAME ,默認(rèn)是index.html,如果你想給你們的安全文件定義為default.html可以使用
define('DIR_SECURE_FILENAME', 'default.html');
還可以支持多個(gè)安全文件寫入,例如你想同時(shí)寫入index.html和index.htm 兩個(gè)文件,以滿足不同的服務(wù)器部署環(huán)境,可以這樣定義:
define('DIR_SECURE_FILENAME', 'index.html,index.htm');
默認(rèn)的安全文件只是寫入一個(gè)空白字符串,如果需要寫入其他內(nèi)容,可以通過DIR_SECURE_CONTENT參數(shù)來指定,例如:
define('DIR_SECURE_CONTENT', 'deney Access!');
下面是一個(gè)完整的使用目錄安全寫入的例子
define('BUILD_DIR_SECURE',true);
define('DIR_SECURE_FILENAME', 'index.html');
define('DIR_SECURE_CONTENT', 'deney Access!');
除了目錄安全之外,還需要保護(hù)模板文件不被直接訪問,因?yàn)橛锌赡軙?huì)在模板文件中暴露數(shù)據(jù)表的字段信息。解決辦法是配置.htaccess文件(針對(duì)Apache服務(wù)器,其他服務(wù)器參考修改),把以下代碼保存在項(xiàng)目的模板目錄目錄(默認(rèn)是Tpl)下保存存為.htaccess。
<Files *.html>
  Order Allow,Deny 
  Deny from all
</Files>
如果你的模板文件后綴不是html可以將*.html改成你的模板文件的后綴。

表單安全

自動(dòng)驗(yàn)證和自動(dòng)完成

ThinkPHP內(nèi)置的自動(dòng)驗(yàn)證和自動(dòng)完成功能可以有效地對(duì)表單提交的數(shù)據(jù)安全加以控制。這兩部分在快速入門系列中已經(jīng)有過詳細(xì)的介紹,就不再描述了。

表單令牌

ThinkPHP內(nèi)置了表單令牌驗(yàn)證功能,可以有效防止表單的重復(fù)提交等安全防護(hù)。
表單令牌驗(yàn)證相關(guān)的配置參數(shù)有:
'TOKEN_ON'=>true,  // 是否開啟令牌驗(yàn)證 默認(rèn)關(guān)閉
'TOKEN_NAME'=>'__hash__',    // 令牌驗(yàn)證的表單隱藏字段名稱
'TOKEN_TYPE'=>'md5',  //令牌哈希驗(yàn)證規(guī)則 默認(rèn)為MD5
'TOKEN_RESET'=>true,  //令牌驗(yàn)證出錯(cuò)后是否重置令牌 默認(rèn)為true
如果開啟表單令牌驗(yàn)證功能,系統(tǒng)會(huì)自動(dòng)在帶有表單的模板文件里面自動(dòng)生成以TOKEN_NAME為名稱的隱藏域,其值則是TOKEN_TYPE方式生成的哈希字符串,用于實(shí)現(xiàn)表單的自動(dòng)令牌驗(yàn)證。
自動(dòng)生成的隱藏域位于表單Form結(jié)束標(biāo)志之前,如果希望自己控制隱藏域的位置,可以手動(dòng)在表單頁面添加{__TOKEN__} 標(biāo)識(shí),系統(tǒng)會(huì)在輸出模板的時(shí)候自動(dòng)替換。
如果頁面中存在多個(gè)表單,建議添加{__TOKEN__}標(biāo)識(shí),并確保只有一個(gè)表單需要令牌驗(yàn)證。
如果個(gè)別頁面輸出不希望進(jìn)行表單令牌驗(yàn)證,可以在控制器中的輸出方法之前動(dòng)態(tài)關(guān)閉表單令牌驗(yàn)證,例如:
C('TOKEN_ON',false);
$this->display();
模型類在創(chuàng)建數(shù)據(jù)對(duì)象的同時(shí)會(huì)自動(dòng)進(jìn)行表單令牌驗(yàn)證操作,如果你沒有使用create方法創(chuàng)建數(shù)據(jù)對(duì)象的話,則需要手動(dòng)調(diào)用模型的autoCheckToken方法進(jìn)行表單令牌驗(yàn)證。如果返回false,則表示表單令牌驗(yàn)證錯(cuò)誤。例如:
$User = M("User"); // 實(shí)例化User對(duì)象
// 手動(dòng)進(jìn)行令牌驗(yàn)證
if (!$User->autoCheckToken($_POST)){
// 令牌驗(yàn)證錯(cuò)誤
}

表單合法性檢測(cè)

表單合法性檢測(cè)是3.1版本開始增加的表單提交字段檢測(cè)機(jī)制,你不再需要擔(dān)心用戶在提交表單的時(shí)候注入非法字段數(shù)據(jù)了。表單字段合法性檢測(cè)需要使用create方法創(chuàng)建數(shù)據(jù)對(duì)象的時(shí)候才能生效,有兩種方式:

一、屬性定義

可以給模型配置insertFields 和 updateFields屬性用于新增和編輯表單設(shè)置,使用create方法創(chuàng)建數(shù)據(jù)對(duì)象的時(shí)候,不在定義范圍內(nèi)的屬性將直接丟棄,避免表單提交非法數(shù)據(jù)。
insertFields 和 updateFields屬性的設(shè)置采用字符串(逗號(hào)分割多個(gè)字段)或者數(shù)組的方式,例如:
class UserModel extends Model{
    protected $insertFields = array('account','password','nickname','email');
    protected $updateFields = array('nickname','email');
}
設(shè)置的字段應(yīng)該是實(shí)際的數(shù)據(jù)表字段,而不受字段映射的影響。
在使用的時(shí)候,我們調(diào)用create方法的時(shí)候,會(huì)根據(jù)提交類型自動(dòng)識(shí)別insertFields和updateFields屬性:
D('User')->create();
使用create方法創(chuàng)建數(shù)據(jù)對(duì)象的時(shí)候,新增用戶數(shù)據(jù)的時(shí)候,就會(huì)屏蔽'account','password','nickname','email' 之外的字段,編輯的時(shí)候就會(huì)屏蔽'nickname','email'之外的字段。
下面是采用字符串定義的方式,同樣有效:
class UserModel extends Model{
    protected $insertFields = 'account,password,nickname,email';
    protected $updateFields = 'nickname,email';
}

二、方法調(diào)用

如果不想定義insertFields和updateFields屬性,或者希望可以動(dòng)態(tài)調(diào)用,可以在調(diào)用create方法之前直接調(diào)用field方法,例如,實(shí)現(xiàn)和上面的例子同樣的作用:
在新增用戶數(shù)據(jù)的時(shí)候,使用:
$User = M('User');
$User->field('account,password,nickname,email')->create();
$User->add();
而在更新用戶數(shù)據(jù)的時(shí)候,使用:
$User = M('User');
$User->field('nickname,email')->create();
$User->where($map)->save();
這里的字段也是實(shí)際的數(shù)據(jù)表字段。field方法也可以使用數(shù)組方式。
如果你的字段比較多,還可以使用field方法的排除功能,例如:
$User->field('status,create_time',true)->create();

變量安全

變量安全獲取

對(duì)全局系統(tǒng)變量的獲取建議采用系統(tǒng)提供的變量獲取方法獲取,具體可以參考快速入門系列的變量

全局變量過濾

如果你習(xí)慣于直接調(diào)用$_GET $_POST變量的話,那么或者可以采用ThinkPHP系統(tǒng)內(nèi)置的對(duì)全局變量的安全過濾方式,只需要設(shè)置VAR_FILTERS參數(shù)。
例如:
'VAR_FILTERS'=>'htmlspecialchars'
在3.1.2版本開始,安全過濾方法的定義函數(shù)需要調(diào)整為引用返回的方式,而且能夠?qū)崿F(xiàn)多維數(shù)組的遞歸過濾,例如:
'VAR_FILTERS'=>'filter_vars'
對(duì)應(yīng)的過濾方法定義如下:
function filter_vars(&$value){
    $value = htmlspecialchars($value);
}

數(shù)據(jù)安全

防SQL注入

對(duì)于WEB應(yīng)用來說,SQL注入攻擊無疑是首要防范的安全問題,系統(tǒng)底層對(duì)于數(shù)據(jù)安全方面本身進(jìn)行了很多的處理和相應(yīng)的防范機(jī)制,例如:
$User = M("User"); // 實(shí)例化User對(duì)象
$User->find($_GET["id"]);

即便用戶輸入了一些惡意的id參數(shù),系統(tǒng)也會(huì)強(qiáng)制轉(zhuǎn)換成整型,避免惡意注入。這是因?yàn)?,系統(tǒng)會(huì)對(duì)數(shù)據(jù)進(jìn)行強(qiáng)制的數(shù)據(jù)類型檢測(cè),并且對(duì)數(shù)據(jù)來源進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換。而且,對(duì)于字符串類型的數(shù)據(jù),ThinkPHP都會(huì)進(jìn)行escape_string處理。
通常的安全隱患在于你的查詢條件使用了字符串參數(shù),然后其中一些變量又依賴由客戶端的用戶輸入,要有效的防止SQL注入問題,我們建議:
查詢條件盡量使用數(shù)組方式,這是更為安全的方式;
如果不得已必須使用字符串查詢條件,使用預(yù)處理機(jī)制;

查詢條件預(yù)處理

where方法使用字符串條件的時(shí)候,支持預(yù)處理(安全過濾),并支持兩種方式傳入預(yù)處理參數(shù),例如:
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
或者
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
模型的query和execute方法 同樣支持預(yù)處理機(jī)制,例如:
$model->query('select * from user where id=%d and status=%d',$id,$status);
或者
$model->query('select * from user where id=%d and status=%d',array($id,$status));
execute方法用法同query方法。

防XSS攻擊

XSS(跨站腳本攻擊)可以用于竊取其他用戶的Cookie信息,要避免此類問題,可以采用如下解決方案:
直接過濾所有的JavaScript腳本;
轉(zhuǎn)義Html元字符,使用htmlentities、htmlspecialchars等函數(shù);
系統(tǒng)的擴(kuò)展函數(shù)庫提供了XSS安全過濾的remove_xss方法;
新版對(duì)URL訪問的一些系統(tǒng)變量已經(jīng)做了XSS處理。

上傳安全

網(wǎng)站的上傳功能也是一個(gè)非常容易被攻擊的入口,所以對(duì)上傳功能的安全檢查是尤其必要的。
系統(tǒng)提供的上傳擴(kuò)展類庫(ORG.Net.UploadFile)提供了安全方面的支持,包括對(duì)文件后綴、文件類型、文件大小以及上傳圖片文件的合法性檢查,確保你已經(jīng)在上傳操作中啟用了這些合法性檢查。

其他安全建議

下面的一些安全建議也是非常重要的:
對(duì)所有公共的操作方法做必要的安全檢查,防止用戶通過URL直接調(diào)用;
不要緩存需要用戶認(rèn)證的頁面;
對(duì)于關(guān)鍵操作需要檢查用戶權(quán)限;
對(duì)用戶的上傳文件,做必要的安全檢查,例如上傳路徑和非法格式。
如非必要,不要開啟服務(wù)器的目錄瀏覽權(quán)限;
對(duì)于項(xiàng)目進(jìn)行充分的測(cè)試,不要生成業(yè)務(wù)邏輯的安全隱患(這可能是最大的安全問題);
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 女男羞羞视频网站免费 | 国产在线精品福利一区二区三区 | 欧美jizzjizz在线播放 | 欧美啊啊 | 亚洲小视频 | 成人午夜精品网站在线观看 | 欧洲自拍 | 欧美一级aa毛片禁片 | 久久国产亚洲欧美日韩精品 | 亚洲国产精品日韩一线满 | 日韩高清欧美精品亚洲 | 亚洲男人的天堂久久精品 | 福利片在线观看 | 国产不卡精品一区二区三区 | jizz国产精品 | 2022国产精品网站在线播放 | 成人在线视频国产 | 国产91区精品福利在线社区 | 精品国产一区二区二三区在线观看 | 精品一区二区三区视频在线观看免 | 免费的黄色网址 | 99国产精品久久久久久久成人热 | 欧美高清一区 | 亚洲专区在线播放 | 国产成人精品免费久久久久 | 欧美黑人性受xxxx喷水 | 特级黄aaaaaaaaa毛片 | 亚洲一区二区三区视频 | 一级色网站 | 亚洲一区二区三区夜色 | 青青青青在线成人视99 | 一区二区三区在线视频观看 | 一本色道久久爱88a 一本视频在线 | 欧美老人巨大xxxx做受视频 | 性欧美极品videos | 香蕉乱码成人久久天堂爱免费 | 欧美性bbwbbwbbwbbwbbw | 欧美一区二区三区在线播放 | 久久精品免视看国产明星 | 久久无码精品一区二区三区 | 69av视频|