待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
在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
在 Laravel 中,request->all()
用於取得請求中的所有輸入數據,包括查詢字串、表單資料、檔案等。 雖然在某些情況下這樣的用法是方便的,但有一些潛在的安全風險,特別是在處理使用者提交的資料時,如果使用者提交了不受信任的數據,可能會引入安全漏洞,如 SQL 注入、XSS 攻擊等。
應使用驗證器來驗證和過濾使用者輸入或僅取得所需的字段,例如...
$request->validated();
$request->only();
$request->except();
根據影片講到,如果取得上傳的檔案時,避免使用getClientOriginalName
和getClientOriginalExtension
方法,因為這是被認為是不安全的,因為檔案名稱和副檔名可能會被惡意使用者篡改。
文檔建議改用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...
在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在正式環境應該要關起來,這應該是要熟記到不行了,就沒在整理出來~一起進步~