ThinkPHP的安全注意事項(xiàng)有哪些-創(chuàng)新互聯(lián)

這篇文章主要介紹了ThinkPHP的安全注意事項(xiàng)有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、沙坡頭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

首先,沒(méi)有絕對(duì)的安全,只要你有足夠的安全意識(shí)才能盡可能的杜絕安全隱患。規(guī)范的使用框架,能讓你盡量避免一些看起來(lái)比較幼稚的安全問(wèn)題。本文描述的安全注意事項(xiàng)主要是指生產(chǎn)環(huán)境下面的安全策略,本地開(kāi)發(fā)的情況下有時(shí)候?yàn)榱苏{(diào)試的需要安全并不是第一考慮。

ThinkPHP在考慮開(kāi)發(fā)體驗(yàn)的同時(shí),仍然十分重視框架的底層安全,雖然屢有安全漏洞被播報(bào),但官方都是第一時(shí)間進(jìn)行修復(fù)處理,而且大部分漏洞只要開(kāi)發(fā)者有一定的安全意識(shí)都是可以避免的,今年也和國(guó)內(nèi)的幾個(gè)安全團(tuán)隊(duì)建立了合作關(guān)系,有助于提前發(fā)現(xiàn)和及時(shí)修正框架可能被利用的漏洞或者隱患。

規(guī)范部署

這一點(diǎn)很多開(kāi)發(fā)者不是特別重視,安全是一個(gè)整體性的問(wèn)題,任何一個(gè)環(huán)節(jié)出問(wèn)題,帶來(lái)的后果都是一樣的嚴(yán)重,部署的安全策略是一個(gè)基礎(chǔ)安全問(wèn)題。

很多開(kāi)發(fā)者往往不按照官方的部署規(guī)范進(jìn)行部署,請(qǐng)務(wù)必把你的WEB根目錄指向public目錄而不是應(yīng)用根目錄,并且不要隨意更改入口文件的位置。public目錄下面不要放除了入口文件和資源文件以外的其它應(yīng)用文件。

關(guān)閉調(diào)試模式

在部署到生產(chǎn)環(huán)境的時(shí)候,確保你已經(jīng)關(guān)閉了調(diào)試模式,可以通過(guò)修改環(huán)境變量的方式關(guān)閉調(diào)試模式。

APP_DEBUG=false

無(wú)論是本地開(kāi)發(fā)還是生產(chǎn)環(huán)境部署,都不建議直接通過(guò)修改配置文件的方式開(kāi)啟/關(guān)閉調(diào)試模式,而應(yīng)該使用環(huán)境變量(本地開(kāi)發(fā)可以通過(guò)定義.env文件)。

關(guān)閉調(diào)試模式后,系統(tǒng)的健康狀態(tài)和運(yùn)行監(jiān)控主要依靠日志或者你使用的監(jiān)控服務(wù)。所以,要養(yǎng)成定時(shí)檢查日志和運(yùn)行狀態(tài)的習(xí)慣。

請(qǐng)求變量過(guò)濾

永遠(yuǎn)不要相信用戶的輸入,這是一句至理名言。盡可能的過(guò)濾請(qǐng)求變量能有效防范大部分的漏洞和隱患。

框架建議的獲取請(qǐng)求變量的方法是Request類(lèi)的param方法(如非必要不要再使用get或者post方法獲取,更不要使用原生的$_GET/$_POST等方法獲?。?。

public function index(Request $request)
{
    $name = $request->param('name');
    // 在這里可以根據(jù)你的業(yè)務(wù)需求進(jìn)行更嚴(yán)謹(jǐn)?shù)倪^(guò)濾
    // 例如 $name = $request->param('name','','htmlentities,strtolower');
    // 或者使用驗(yàn)證器進(jìn)行專(zhuān)門(mén)的驗(yàn)證
}

對(duì)于有明確類(lèi)型的請(qǐng)求變量,可以在使用param方法的時(shí)候使用類(lèi)型強(qiáng)制轉(zhuǎn)換,例如:

public function index(Request $request)
{
    // 強(qiáng)制轉(zhuǎn)換字符串?dāng)?shù)據(jù)
    $name = $request->param('name/s');
    // 強(qiáng)制轉(zhuǎn)換整型數(shù)據(jù)
    $name = $request->param('id/d');
    // 強(qiáng)制轉(zhuǎn)換浮點(diǎn)型數(shù)據(jù)
    $name = $request->param('score/f');
}

或者直接使用方法參數(shù)獲取請(qǐng)求變量

public function index(string $name)
{
    // 在這里可以根據(jù)你的業(yè)務(wù)需求進(jìn)行更嚴(yán)謹(jǐn)?shù)倪^(guò)濾
    // 或者使用驗(yàn)證器進(jìn)行專(zhuān)門(mén)的驗(yàn)證
}

如果你需要對(duì)所有數(shù)據(jù)進(jìn)行處理,可以設(shè)置全局的過(guò)濾方法。對(duì)不同的應(yīng)用需求設(shè)置default_filter過(guò)濾規(guī)則(默認(rèn)沒(méi)有任何過(guò)濾規(guī)則),常見(jiàn)的安全過(guò)濾函數(shù)包括stripslashes、htmlentities、htmlspecialchars和strip_tags等,請(qǐng)根據(jù)業(yè)務(wù)場(chǎng)景選擇最合適的過(guò)濾方法。

如果需要獲取多個(gè)數(shù)據(jù),建議使用only方法指定需要獲取的變量名稱(chēng),避免有些不懷好意的數(shù)據(jù)提交導(dǎo)致權(quán)限問(wèn)題。

public function index(Request $request)
{
    // 指定表單數(shù)據(jù)名稱(chēng)
    $data = $request->only(['name','title']);
}

當(dāng)你使用數(shù)據(jù)庫(kù)或者模型操作寫(xiě)入數(shù)據(jù)的時(shí)候,也可以指定字段,避免非法和不希望的字段寫(xiě)入數(shù)據(jù)庫(kù)。

// 模型
User::allowField(['name','title'])
    ->save($data);
// 數(shù)據(jù)庫(kù)
Db::name('user')
    ->field(['name','title'])
    ->insert($data);

模型還有一個(gè)只讀字段的功能能避免你的數(shù)據(jù)受到外部的修改。

上傳檢測(cè)

網(wǎng)站的上傳功能也是一個(gè)非常容易被攻擊的入口,所以對(duì)上傳功能的安全檢查是尤其必要的。

系統(tǒng)的think\File類(lèi)提供了文件上傳的安全支持,包括對(duì)文件后綴、文件類(lèi)型、文件大小以及上傳圖片文件的合法性檢查,確保你已經(jīng)在上傳操作中啟用了這些合法性檢查,可以參考手冊(cè)的上傳章節(jié)。

SQL注入

ThinkPHP的查詢統(tǒng)一使用了PDO的prepare預(yù)查詢和參數(shù)綁定機(jī)制,能有效的避免SQL注入的發(fā)生。但不代表絕對(duì)安全,如果你缺乏良好的代碼規(guī)范,仍然有可能被利用。

一個(gè)最簡(jiǎn)單的原則就是不要讓用戶決定你的查詢條件(或者字段排序)和控制你的查詢數(shù)據(jù)。

對(duì)于一些字符串的查詢條件(包括原生查詢)或者特殊的查詢(包括ORDER部分),需要手動(dòng)進(jìn)行參數(shù)綁定。

// 錯(cuò)誤的
Db::query("select * from think_user where id=$id AND status=$statis");
// 正確的
Db::query("select * from think_user where id=? AND status=?", [ $id, $status]);
// 正確的
Db::execute("update think_user set name=:name where status=:status", [
    'name'     => 'thinkphp', 
    'status'   => 1
]);

對(duì)于使用了whereExp和whereRaw方式的查詢,你也需要使用參數(shù)綁定。

Db::name('user')
    ->whereRaw('id > ? AND status = ?',[10, 1])
    ->select();

使用驗(yàn)證器

對(duì)于大量的表單需要驗(yàn)證的情況,建議使用驗(yàn)證器功能統(tǒng)一進(jìn)行數(shù)據(jù)的合規(guī)驗(yàn)證。驗(yàn)證器的驗(yàn)證操作應(yīng)該在控制器或者路由階段使用validate方法進(jìn)行處理,模型的數(shù)據(jù)驗(yàn)證功能新版已經(jīng)取消不再建議使用,模型和數(shù)據(jù)庫(kù)操作的時(shí)候應(yīng)該傳入經(jīng)過(guò)安全處理過(guò)的數(shù)據(jù)。

XSS攻擊

跨站腳本攻擊(cross-site scripting,簡(jiǎn)稱(chēng) XSS),XSS是一種在web應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁(yè)面中。

在渲染輸出的頁(yè)面中,要對(duì)一些數(shù)據(jù)進(jìn)行安全處理,防止被惡意利用造成XSS攻擊,如果是5.1版本的話,所有的輸出都已經(jīng)經(jīng)過(guò)了htmlentities 轉(zhuǎn)義輸出,確保安全。如果是5.0版本的話,你可以自定義一個(gè)xss過(guò)濾函數(shù),在模板文件中對(duì)一些關(guān)鍵內(nèi)容變量進(jìn)行函數(shù)處理。

CSRF

CSRF 跨站請(qǐng)求偽造是 Web 應(yīng)用中最常見(jiàn)的安全威脅之一,攻擊者偽造目標(biāo)用戶的HTTP請(qǐng)求,然后此請(qǐng)求發(fā)送到有CSRF漏洞的網(wǎng)站,網(wǎng)站執(zhí)行此請(qǐng)求后,引發(fā)跨站請(qǐng)求偽造攻擊。攻擊者利用隱蔽的HTTP連接,讓目標(biāo)用戶在不注意的情況下單擊這個(gè)鏈接,由于是用戶自己點(diǎn)擊的,而他又是合法用戶擁有合法權(quán)限,所以目標(biāo)用戶能夠在網(wǎng)站內(nèi)執(zhí)行特定的HTTP鏈接,從而達(dá)到攻擊者的目的。

開(kāi)啟表單令牌驗(yàn)證,盡量開(kāi)啟強(qiáng)制路由并嚴(yán)格規(guī)范每個(gè)URL請(qǐng)求,定義單獨(dú)的MISS路由規(guī)則。

遵循請(qǐng)求類(lèi)型的使用規(guī)范并做好權(quán)限驗(yàn)證,刪除操作必須使用DELETE請(qǐng)求,數(shù)據(jù)更改操作必須使用POST、PUT 或者 PATCH 請(qǐng)求方法,GET請(qǐng)求不應(yīng)該更改任何數(shù)據(jù)。

會(huì)話劫持

會(huì)話劫持是指攻擊者利用各種手段來(lái)獲取目標(biāo)用戶的session id。一旦獲取到session id,那么攻擊者可以利用目標(biāo)用戶的身份來(lái)登錄網(wǎng)站,獲取目標(biāo)用戶的操作權(quán)限。

有效的防護(hù)策略包括:

在每次會(huì)話啟動(dòng)的時(shí)候,調(diào)用regenerate方法。

Session::start();
Session::regenerate(true);

更改session配置參數(shù),開(kāi)啟安全選項(xiàng):

'use_trans_sid' => 0,
'httponly' => true,
'secure' => true,

升級(jí)到安全版本

官方會(huì)對(duì)一些安全隱患和潛在漏洞進(jìn)行修復(fù),并且發(fā)布一個(gè)更為安全的版本。請(qǐng)確認(rèn)你升級(jí)到更安全的版本,確保底層的安全和健壯性。

目前各個(gè)版本的建議版本如下:

ThinkPHP的安全注意事項(xiàng)有哪些

業(yè)務(wù)邏輯安全

這個(gè)屬于應(yīng)用層面的安全,很多漏洞源于某個(gè)業(yè)務(wù)邏輯自身的安全隱患,包括沒(méi)有做合理的數(shù)據(jù)驗(yàn)證和權(quán)限檢查,尤其是涉及資金及財(cái)務(wù)層面的,一定要做更多的安全檢查,并且開(kāi)啟事務(wù)。一個(gè)好的建議是更多的對(duì)應(yīng)用進(jìn)行分層設(shè)計(jì),減少每層的復(fù)雜性,獨(dú)立的分層設(shè)計(jì)便于提高安全性。

服務(wù)器安全

最后一點(diǎn)是運(yùn)維階段需要特別注意的,及時(shí)更新服務(wù)器的安全補(bǔ)丁,確保沒(méi)有可利用的公開(kāi)系統(tǒng)漏洞,包括你的數(shù)據(jù)庫(kù)系統(tǒng)安(尤其是數(shù)據(jù)備份工作)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ThinkPHP的安全注意事項(xiàng)有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

文章題目:ThinkPHP的安全注意事項(xiàng)有哪些-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://muchs.cn/article36/ddogpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、企業(yè)建站App開(kāi)發(fā)、網(wǎng)站排名、服務(wù)器托管、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站