iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 18
0
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 18

[Day 18] 繼續談 resource,建立表單來新增文章

上一篇聊到了建立表單,也可以列舉出所有文章了,剩下的就是建立表單囉!

今天我們來聊聊怎麼用網頁的方式,來建立文章!

連接新增文章網址

前面我們用 resources/views/posts/index.blade.php 建立了列出所有文章的路徑。

與這個方式類似,我們建立 resources/views/posts/create.blade.php,建立新增文章的路徑

新增文章

成功的話,我們連接 http://127.0.0.1/posts/create 應該就會看到「新增文章」四個字

接著,我們建立輸入文章內容的表單,改寫 create.blade.php 如下

新增文章

<form action="{{ route('posts.store') }}" method="POST">
    @csrf
    <label>內容:
        <textarea name="content"></textarea>
    </label><br>
    <input type="submit" value="送出文章">
</form>

然後我們在 app/Http/Controllers/PostController 裡面,改寫 store()

public function store(Request $request)
{
    var_dump($request->input());
}

成功的話,應該可以看到類似這樣的回傳:

array(2) { ["_token"]=> string(40) "tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX" ["content"]=> string(3) "asd" }

看到這裡,相信聰明的讀者應該想通了,為什麼雖然針對資料只有五個動作,但是卻建立了七個路徑。其中兩個路徑是用來填寫新增和修改的表單用的!

所以 create() 放的是新增用的表單,store()放的是新增表單的行為。

edit() 放的是修改用的表單,update()放的是修改表單的行為。

取得這個資料後,我們就可以很快的應用前面所學的技巧來新增資料囉,改寫 store()

public function store(Request $request)
{
    $post = new Post;
    $post->content = $request->input('content');
    $post->subject_id = 0;
    $post->save();
    return redirect(route('posts.index'));
}

成功囉!現在我們就可以透過表單建立文章,並且建立完成之後還會自動導向到列表所有文章的頁面了!

@csrf

不過,細心的讀者可能還會有個疑問:之前表單內的 @csrf 是什麼,然後 $request->input() 為什麼會有["_token"]=> string(40) "tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX" 這串文字?

這,就要從什麼是 CSRF 開始說起囉!


CSRF,或者說 Cross-site request forgery,也就是跨站請求偽造,是一種網站的攻擊方式。

這種攻擊方式,是明明不是用戶自己的輸入,但是其他人偽造成該用戶的身份,假裝是該用戶進行發出請求。

要避免這種攻擊,其中一種方式就是在表單內多加一個 token。這個 token 是攻擊者無法取得的。這樣的話,即使攻擊者可以偽造成該用戶的身份,但是因為他無法取得這個 token,那麼他的請求就無法通過。

這個 token 在 laravel 的表單內,預設就必須要存在。透過 @csrf 這個樣板,我們可以在網頁內自動加上

<input type="hidden" name="_token" value="tb4GJa8UWOiyN27opznR0yXOsUP34yAckcafj0qX">

這個欄位。

這個欄位的數值,根據 .envAPP_KEY 會有所不同。當你修改你的 APP_KEY,這個欄位的數值也會跟著改變。

我們可以透過執行

$ php artisan key:generate

來做到這件事情。

所以,攻擊者要能跨站攻擊,就必須先得到這串文字。


總結一下今天我們聊到了什麼。

今天我們建立了新增文章的頁面,接收資料的路徑,還學到了 CSRF 這個攻擊方式,以及 Laravel 如何避免該攻擊。

希望大家覺得今天的內容滿意,我們明天見!


上一篇
[Day 17] 開始貼文囉!談操作 Model 的 resource 功能
下一篇
[Day 19] 繼續聊文章!怎麼透過表單編輯文章
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30

尚未有邦友留言

立即登入留言