iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
自我挑戰組

學框架永不嫌晚,從現在開始學Laravel你也可以系列 第 4

Day 3 Laravel基礎功 - CSRF Protection跨領域攻擊的防護機制

  • 分享至 

  • xImage
  •  

按進度應該要來介紹Controller,但發生一點狀況因此先來介紹CSRF,Laravel的跨域防護是利用token來實現的。

首先,我們要先知道CSRF,全名是 Cross Site Request Forgery( 跨站請求偽造)。
當我們在登入系統的時候會產生Cookie和Session,這兩個東西是讓網站識別你是誰的一種鑰匙
以這個例子來說,Session在使用者登入後會在伺服器的電腦產生session的檔案,當作你已經成功的登入
Cookie則是伺服器的Session產生後,在使用者端用來存放伺服器回傳Session的部分內容
接著我們要開始修改我們個人在網站上的相關內容而發出我們的請求,除了攜帶我們要更改的資料以外也會包含Session的部分訊息,當伺服器接收到這個請求,會檢查這個請求是否已登入到系統,若比對到相同的Session就會以此來做依據,來完成你提出修改資料的請求,而跨域攻擊就是當你登入網站後當中所產生的cookie或session被惡意盜取。盜取者就能利用取得的cookie或session來偽造假的請求,向伺服器來修改你的資料,尤其是跟金融帳戶相關的網站,也可以藉此來盜領你帳戶的財產。

而token(又名權杖)可以包裹在Session內,且可反覆的更新產生,在完成一次請求後可以更新為新的token再回傳給使用者,而在進行下一次請求的時候,如果我們在上一次請求產生新的token給客戶端帶回去,那麼之後客戶端必須帶著新token的session來進行驗證,成功才可執行請求。

那麼我們要如何產生我們的token,官方的文件裡有寫到

Laravel 會自動為每個有效的使用者 Session 產生一個由網站管理的 CSRF「權杖 (Token)」。
所以我們這一步驟可以不用做任何事情

如何取出我們的token一探究竟

use Illuminate\Http\Request;


Route::get('/token', function (Request $request) {
    
    //取出我們請求內Session內的token
    $token = $request->session()->token();
    
    //等於下面這個
    
    $token = csrf_token();

});

發請求的表單內入包含我們的token值以驗證是我本人

<form method="POST" action="/profile">

    @csrf
    
    <!-- 同等於下面這個 -->

    <input type="hidden" name="_token" value="{{ csrf_token() }}" />

</form>

參考文章:https://docs.cornch.dev/zh-tw/laravel/9.x/csrf


上一篇
Day 3 Laravel基礎功 - 視圖View
下一篇
Day 5 Laravel基礎功 - 控制器Controller
系列文
學框架永不嫌晚,從現在開始學Laravel你也可以14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言