iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 25
0
Modern Web

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

[Day 25] 覺得自己的系統還不夠安全?用 laravel 快速的加解密!

我們做完了針對文章的各種功能,也做了用戶權限的管控。但是有的人可能會擔心資料庫的內容不夠安全,或許可以加密一下。

這部分, Laravel 也提供了非常簡單的做法,我們一起來嘗試玩看看!

Laravel 的加解密

Laravel 的加密非常簡單,是透過 encrypt() 這個函式實作。

我們透過 test 來測試看看

Route::get('/test', function(){
    return encrypt('123456789');
});

應該會看到一串很像亂碼的數字。這邊要注意,加解密的密碼會跟隨網站的 APP_KEY 變動,所以如果你執行

$ php artisan key:generate

這串加密後的文字,內容就會不一樣了。

要解密的話,也很簡單,就是用 decrypt()來實作。我們可以透過改寫 test

Route::get('/test', function(){
    return decrypt(encrypt('123456789'));
});

就可以解密成原來的 123456789 了。

接著,我們要來介紹 Eloquent 的一個功能:Accessor 和 Mutator

簡介 Accessor 和 Mutator

用之前介紹的兩個函式,其實已經可以實作出加解密的功能了。我們只要在 storeupdate 的時候加密,在 indexshow 的時候解密,基本上功能就算是完成了。

不過,這樣的設計有個缺點,就是每次取用或者更動 Post 的時候,你都要根據寫入或者取出資料時,重新加上加密或者解密。這樣總讓人感覺很麻煩。

幸好,透過 Accessor 和 Mutator 這個功能,我們就可以很簡單的處理加解密的功能。

什麼是 Accessor 和 Mutator 呢?

簡單的說,假設你希望在寫入 Model 的某個值 foo 之前,做一些特殊的處理,只要在 Model 裡面加上 setFooAttribute() 這個函式,那麼在寫入 foo 的時候,就不是寫入內容,而是會呼叫 setFooAttribute()。這類函式被稱為 Mutator。

假設你希望取得 Model 的某個值 foo,只需要在裡面加上 getFooAttribute() 這個函式,不管該物件原本有沒有這個變數,或者這個變數原本內容是什麼,我們都是透過 getFooAttribute() 來取得 foo。這類函式則是被稱為 Accessor。

說了這麼多,不如從範例中實際動手做學習,我們來嘗試看看吧!

改寫 Post,幫他加上兩個函式,getContentAttribute()setContentAttribute()

public function getContentAttribute($content)
{
    return decrypt($content);
}

public function setContentAttribute($content)
{
    $this->attributes['content'] = encrypt($content);
}

然後,我們把之前沒有加密的資料清空

$ php artisan migrate:refresh --seed

然後,我們到資料庫裡面看看。如果操作正確的話,現在資料庫裡面的所有測試文章,應該都會是亂碼。

不過,我們在 http://127.0.0.1/posts 實際看到的文章,卻全部都是原本的樣子。到這邊,我們的加解密功能,就大功告成囉!


小小總結一下今天我們學到的東西。

今天我們學會了 Laravel 提供的加解密功能,加上怎麼利用 Model 的 Accessor 和 Mutator 來簡化加解密的程式。

希望各位讀者覺得今天有收穫!我們明天見!


上一篇
[Day 24] 紀錄網站的問題!談寫 Log
下一篇
[Day 26] 定期的事件處理,聊 Laravel Schedule
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30

1 則留言

0
Neil
iT邦新手 5 級 ‧ 2019-12-31 22:08:13

Accessor -> get, Mutator -> set
好像弄相反了。

對的 寫反了

感謝提醒!

我要留言

立即登入留言