Laravel Hashids:把流水號 ID 轉成亂碼

Laravel Hashids 是基於 Hashids 衍生出來的 Laravel 套件,Hashids 是一個小型 library,可以根據數字產生簡短的唯一 ID。
在開發時應該會看過這樣的 URL:
https://example.com/user/1
https://example.com/user/2
https://example.com/user/3
流水號雖然非常直觀,但存在安全疑慮,只要把 /user/1 改成 /user/2,後端判斷又不夠嚴謹時,就可能存取到別人的資料。

透過 Hashids 套件,可以把流水號編碼成看不懂的字串,讓人無法根據流水號猜測網址。

一、安裝

使用 Composer 安裝。
composer require vinkla/hashids

二、設定

下指令 publish hashids 設定檔。
php artisan vendor:publish
會在 config 資料夾中建立 hashids.php 檔案。檔案中可以自訂新的 connections,才不會每次產出都是一樣的字串。
'default' => 'main',

'connections' => [

    'main' => [
        'salt' => '',
        'length' => 0,
        // 'alphabet' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    ],

    'my-project' => [
        'salt' => 'your-salt-string',
        'length' => 'your-length-integer',
        // 'alphabet' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    ],

],

三、使用

1. 基礎用法

使用上也非常簡單,基本上就是 encode、decode。
use Vinkla\Hashids\Facades\Hashids;

Hashids::encode($id);

Hashids::decode($hashId);
也可以搭配自訂的 connection。
use Vinkla\Hashids\Facades\Hashids;

Hashids::connection('my-project')->encode($id);

Hashids::connection('my-project')->decode($hashId);

2. 整合 Model

use Vinkla\Hashids\Facades\Hashids;

class User extends Model
{
    protected $appends = [
        'hashid'
    ];

    public function getHashidAttribute()
    {
        return Hashids::encode($this->id);
    }
}
參考文件

留言