iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 24
3

今天要來分享CSRF保護這部份.

CSRF保護

CSRF(跨網站請求偽造) Cross-site request forgery是請求偽造的惡意攻擊,在使用者登入後,偽造使用者的請求對網站進行攻擊,像是假如我們網站有一個糗情網址可以刪除商品資料merchandise/{merchandise_id}/delete,而當有一個惡意攻擊者再領一個網站放置一個可執行的程式當誘使使用者點到該網站時,就會偽造使用者請求,要求刪除此商品的資料。

當我們在註冊頁面中按下註冊按鈕後,你會看到The page has expired due to inactivity, Please refresh and try again的訊息,當看到這個訊息時,表示我們網站正被Laravel保護著,避免受到CSRF(跨網站請求偽造)攻擊。

未傳送token,點擊按鈕會出現以下畫面
https://ithelp.ithome.com.tw/upload/images/20191004/20105694dTfUi5wtFc.png

而為了讓使用者能夠正確的對網站發出請求,必須在表單上加上CSRF token,在表單資料送出時,也將驗證網站請求的token傳送到控制器,確認是使用者從網站發出的請求,CSRF token產生的方式有兩種,一種是手動加入CSRF token隱藏欄位,欄位變數名稱為_token,欄位中的值使用csrf_token()產生並填入,另一種是利用Laravel提供的csrf_field()方法直接產生該隱藏欄位出來,就像這樣

resources/views/auth/signUp.blade.php

<form action="/user/auth/sign-up" method="post">
    <!-- 手動加入 csrf_token 隱藏欄位,欄位變數名稱為 _token -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}"/>

    <!-- 自動產生 csrf_token 隱藏欄位-->
    {!! csrf_field() !!}

    <button type="submit">註冊</button>
</form>

其實以上兩種方法都可以使用,而且只需要使用其中一種方法就可以了。

接收會員註冊資料

當我們在註冊頁模板加入CSRF token欄位後,在送出表單資料時,就可以看到我們正確的接收到列表傳送過來的會員資料了,而在資料中你也會看到欄位為_token的驗證CSRF token資料,接下來我們就要開始處理使用者傳送過來的資料了

app/Http/Controllers/UserAuthController.php片段

//處理註冊資料
public function signUpProcess()
{
    //接收輸入資料
    $input = request()->all();
    var_dump($input);
    exit;
}

現在重新執行網頁 http://localhost:6943/user/auth/sign-up
https://ithelp.ithome.com.tw/upload/images/20191004/20105694JG7eyHTNaa.png

點擊Button的結果

array(6) { ["_token"]=> string(40) "6OFh15tCjNfOXKynwie4v3asWAXpazecNvIsurxq" ["nickname"]=> string(6) "小魚" ["email"]=> string(7) "a@b.com" ["password"]=> string(6) "123456" ["password_confirmation"]=> string(6) "123456" ["type"]=> string(1) "G" }

整理過後

array(6)
 {
    ["_token"]=> string(40) "6OFh15tCjNfOXKynwie4v3asWAXpazecNvIsurxq" 
    ["nickname"]=> string(6) "小魚"
    ["email"]=> string(7) "a@b.com"
    ["password"]=> string(6) "123456" 
    ["password_confirmation"]=> string(6) "123456" 
    ["type"]=> string(1) "G" 
}

如果沒有輸入會顯示NULL


上一篇
[Day 22] Laravel實作 - 會員註冊(一)
下一篇
[Day 24] Laravel實作 - 會員註冊(三)
系列文
Laravel從入門到放棄…………原生PHP (疑?47

尚未有邦友留言

立即登入留言