2023-12-13|閱讀時間 ‧ 約 5 分鐘

Laravel 安全性,七種開發人員常犯的錯誤

待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。

Laravel Security: Top 7 Mistakes Developers Make


XSS攻擊

在Laravel 裡主要通過Blade模板引擎和ORM 來處理用戶的輸入數據,以減少XSS的風險,而正常的情況下,blade接受一個Controller傳遞一個包含HTML到view時,blade會自動替我們轉譯這些東西,確保用戶輸入的內容不會當作原始HTML來呈現。

首先我們先建立一個Controller 並定義一個output 為html的格式

當我們使用<p>{{ $userInput }}</p> 來進行轉譯時,可以看到如下畫面


而如果想正確使用HTML呈現方式根據文檔說明,我們可以使用{!! $name !!} 來處理,而在這個方式下,就容易會遇到XSS攻擊,要格外小心。

最後結果就會長成這個樣子

而當我們使用{!! $userInput !!}這個方式呈現,那當你取得資料未做處理時,而傳送一個script那就容易遇到XSS攻擊,例如下列程式碼,應該避免這樣子的寫法。

如果將{!! $userInput !!}改為{{ $userInput }},會長成什麼樣子呢?結果如下:最呈現為純文本的方式,而不是執行其中的script

避免直接使用$request->all()

在 Laravel 中,request->all() 用於取得請求中的所有輸入數據,包括查詢字串、表單資料、檔案等。 雖然在某些情況下這樣的用法是方便的,但有一些潛在的安全風險,特別是在處理使用者提交的資料時,如果使用者提交了不受信任的數據,可能會引入安全漏洞,如 SQL 注入、XSS 攻擊等。

應使用驗證器來驗證和過濾使用者輸入或僅取得所需的字段,例如...

$request->validated();
$request->only();
$request->except();


File Uploads: Client Data

根據影片講到,如果取得上傳的檔案時,避免使用getClientOriginalNamegetClientOriginalExtension方法,因為這是被認為是不安全的,因為檔案名稱和副檔名可能會被惡意使用者篡改。

文檔建議改用hashName() extension() 來取得給定檔案上傳的名稱和副檔名


$file = $request->file('avatar'); 
$name = $file->hashName(); // Generate a unique, random name...
$extension = $file->extension(); // Determine the file's extension based on the file's MIME type...


避免使用GET method 來更新你的資料

在Laravel 中預設啟用 CSRF 保護,並在每個表單中產生 CSRF 令牌。 這個令牌用於驗證表單提交的請求是否合法。 你可以在 Blade 模板中使用 @CSRF指令產生 CSRF 令牌,而根據文檔說明如下,這些方法裡面並不包含GET,故應避免使用GET method 來更新你的資料

Anytime you define a "POST", "PUT", "PATCH", or "DELETE" HTML form in your application, you should include a hidden CSRF _token field in the form so that the CSRF protection middleware can validate the request.


而影片另外介紹一個Laravel Rate Limiting這個功能,是可以用於防止惡意使用者或自動化腳本濫用某些資源或服務,避免被DDOS攻擊

Rate Limiting應該會再花另一篇介紹這個好用的東C,以上筆記是我自己認為比較容易忘記的部分進行整理,內容還有講解到.env的暴露跟debug在正式環境應該要關起來,這應該是要熟記到不行了,就沒在整理出來~一起進步~


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.