沒有絕對(duì)安全,只有相對(duì)安全。Laravel 相較于其他框架在安全方面已經(jīng)做得很優(yōu)秀,不過作為開發(fā)者,我們要在日常開發(fā)中對(duì)『安全』需懷著敬畏之心,積極培養(yǎng)自己的安全意識(shí)。以下是一些 Laravel 安全相關(guān)的規(guī)范。
Laravel Debug 開啟時(shí),會(huì)暴露很多能被黑客利用的服務(wù)器信息,所以,生產(chǎn)環(huán)境下請(qǐng) 必須 確保:
APP_DEBUG=false
跨站腳本攻擊(cross-site scripting,簡稱 XSS),具體危害體現(xiàn)在黑客能控制你網(wǎng)站頁面,包括使用 JS 盜取 Cookie 等,關(guān)于 XSS 的介紹請(qǐng)前往 IBM 文檔庫:跨站點(diǎn)腳本攻擊深入解析 。
默認(rèn)情況下,在無法保證用戶提交內(nèi)容是 100% 安全的情況下,必須 使用 Blade 模板引擎的 {{ $content }}
語法會(huì)對(duì)用戶內(nèi)容進(jìn)行轉(zhuǎn)義。
Blade 的 {!! $content !!}
語法會(huì)直接對(duì)內(nèi)容進(jìn)行 非轉(zhuǎn)義 輸出,使用此語法時(shí),必須 使用 HTMLPurifier for Laravel 5 來為用戶輸入內(nèi)容進(jìn)行過濾。
Laravel 的 查詢構(gòu)造器 和 Eloquent 是基于 PHP 的 PDO,PDO 使用 prepared
來準(zhǔn)備查詢語句,保障了安全性。
在使用 raw()
來編寫復(fù)雜查詢語句時(shí),必須 使用數(shù)據(jù)綁定。
錯(cuò)誤的做法:
Route::get('sql-injection', function() {
$name = "admin"; // 假設(shè)用戶提交
$password = "xx' OR 1='1"; // // 假設(shè)用戶提交
$result = DB::select(DB::raw("SELECT * FROM users WHERE name ='$name' and password = '$password'"));
dd($result);
});
以下是正確的做法,利用 select 方法的第二個(gè)參數(shù)做數(shù)據(jù)綁定:
Route::get('sql-injection', function() {
$name = "admin"; // 假設(shè)用戶提交
$password = "xx' OR 1='1"; // // 假設(shè)用戶提交
$result = DB::select(
DB::raw("SELECT * FROM users WHERE name =:name and password = :password"),
[
'name' => $name,
'password' => $password,
]
);
dd($result);
});
DB
類里的大部分執(zhí)行 SQL 的函數(shù)都可傳參第二個(gè)參數(shù) $bindings
。
Laravel 提供白名單和黑名單過濾($fillable
和 $guarded
),開發(fā)者 應(yīng)該 清楚認(rèn)識(shí)批量賦值安全威脅的情況下合理靈活地運(yùn)用。
批量賦值安全威脅,指的是用戶可更新本來不應(yīng)有權(quán)限更新的字段。舉例,users
表里的 is_admin
字段是用來標(biāo)識(shí)用戶『是否是管理員』,某不懷好意的用戶,更改了『修改個(gè)人資料』的表單,增加了一個(gè)字段:
<input name="is_admin" value="1" />
這個(gè)時(shí)候如果你更新代碼如下:
Auth::user()->update(Request::all());
此用戶將獲取到管理員權(quán)限??梢杂泻芏喾N方法來避免這種情況出現(xiàn),最簡單的方法是通過設(shè)置 User 模型里的 $guarded
字段來避免:
protected $guarded = ['id', 'is_admin'];
CSRF 跨站請(qǐng)求偽造是 Web 應(yīng)用中最常見的安全威脅之一,具體請(qǐng)見 Wiki - 跨站請(qǐng)求偽造 或者 Web 應(yīng)用程序常見漏洞 CSRF 的入侵檢測與防范。
Laravel 默認(rèn)對(duì)所有『非冪等的請(qǐng)求』強(qiáng)制使用 VerifyCsrfToken
中間件防護(hù),需要開發(fā)者做的,是區(qū)分清楚什么時(shí)候該使用『非冪等的請(qǐng)求』。
冪等請(qǐng)求指的是:’HEAD’, ‘GET’, ‘OPTIONS’,既無論你執(zhí)行多少次重復(fù)的操作都不會(huì)給資源造成變更。
更多建議: