99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

Laravel 項目開發(fā)規(guī)范 Laravel 安全實踐

2023-02-16 17:12 更新

說明

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

關閉 DEBUG

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

APP_DEBUG=false

XSS

跨站腳本攻擊(cross-site scripting,簡稱 XSS),具體危害體現(xiàn)在黑客能控制你網站頁面,包括使用 JS 盜取 Cookie 等,關于 XSS 的介紹請前往 IBM 文檔庫:跨站點腳本攻擊深入解析 。

默認情況下,在無法保證用戶提交內容是 100% 安全的情況下,必須 使用 Blade 模板引擎的 {{ $content }} 語法會對用戶內容進行轉義。

Blade 的 {!! $content !!} 語法會直接對內容進行 非轉義 輸出,使用此語法時,必須 使用 HTMLPurifier for Laravel 5 來為用戶輸入內容進行過濾。

SQL 注入

Laravel 的 查詢構造器 和 Eloquent 是基于 PHP 的 PDO,PDO 使用 prepared 來準備查詢語句,保障了安全性。

在使用 raw() 來編寫復雜查詢語句時,必須 使用數(shù)據綁定。

錯誤的做法:

Route::get('sql-injection', function() {
    $name = "admin"; // 假設用戶提交
    $password = "xx' OR 1='1"; // // 假設用戶提交
    $result = DB::select(DB::raw("SELECT * FROM users WHERE name ='$name' and password = '$password'"));
    dd($result);
});

以下是正確的做法,利用 select 方法的第二個參數(shù)做數(shù)據綁定:

Route::get('sql-injection', function() {
    $name = "admin"; // 假設用戶提交
    $password = "xx' OR 1='1"; // // 假設用戶提交
    $result = DB::select(
        DB::raw("SELECT * FROM users WHERE name =:name and password = :password"),
        [
            'name' => $name,
            'password' => $password,
        ]
    );
    dd($result);
});

DB 類里的大部分執(zhí)行 SQL 的函數(shù)都可傳參第二個參數(shù) $bindings。

批量賦值

Laravel 提供白名單和黑名單過濾($fillable 和 $guarded),開發(fā)者 應該 清楚認識批量賦值安全威脅的情況下合理靈活地運用。

批量賦值安全威脅,指的是用戶可更新本來不應有權限更新的字段。舉例,users 表里的 is_admin 字段是用來標識用戶『是否是管理員』,某不懷好意的用戶,更改了『修改個人資料』的表單,增加了一個字段:

<input name="is_admin" value="1" />

這個時候如果你更新代碼如下:

Auth::user()->update(Request::all());

此用戶將獲取到管理員權限??梢杂泻芏喾N方法來避免這種情況出現(xiàn),最簡單的方法是通過設置 User 模型里的 $guarded 字段來避免:

protected $guarded = ['id', 'is_admin'];

CSRF

CSRF 跨站請求偽造是 Web 應用中最常見的安全威脅之一,具體請見 Wiki - 跨站請求偽造 或者 Web 應用程序常見漏洞 CSRF 的入侵檢測與防范。

Laravel 默認對所有『非冪等的請求』強制使用 VerifyCsrfToken 中間件防護,需要開發(fā)者做的,是區(qū)分清楚什么時候該使用『非冪等的請求』。

冪等請求指的是:’HEAD’, ‘GET’, ‘OPTIONS’,既無論你執(zhí)行多少次重復的操作都不會給資源造成變更。

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號