Laravel 項(xiàng)目開發(fā)規(guī)范 Laravel 安全實(shí)踐

2023-02-16 17:12 更新

說明

沒有絕對(duì)安全,只有相對(duì)安全。Laravel 相較于其他框架在安全方面已經(jīng)做得很優(yōu)秀,不過作為開發(fā)者,我們要在日常開發(fā)中對(duì)『安全』需懷著敬畏之心,積極培養(yǎng)自己的安全意識(shí)。以下是一些 Laravel 安全相關(guān)的規(guī)范。

關(guān)閉 DEBUG

Laravel Debug 開啟時(shí),會(huì)暴露很多能被黑客利用的服務(wù)器信息,所以,生產(chǎn)環(huán)境下請(qǐng) 必須 確保:

APP_DEBUG=false

XSS

跨站腳本攻擊(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)行過濾。

SQL 注入

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

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ì)給資源造成變更。

  • 所有刪除的動(dòng)作,必須 使用 DELETE 作為請(qǐng)求方法;
  • 所有對(duì)數(shù)據(jù)更新的動(dòng)作,必須 使用 POST、PUT 或者 PATCH 請(qǐng)求方法。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)