Laravel 哈希數據 ID

為甚麼需要 hash ID

在專案中,我們數據的 ID 通常是自行增加的,如使用 Url get 的參數是商品 ID 會造成以下問題

  1. 數據的 ID 是公開的,不希望對外暴露有規則索引
  2. 防止爬蟲侵擾
  3. 容易根據 ID 猜測數專案中的商品數量
  4. 隨著數據的增長,ID 會越來越大,無法統一長度

這時後就可以靠 hash id 來加密解決問題,還有很多種解決方案,例如使用 UUID,使用自己的邏輯創建新的 id 欄位,今天來介紹一個簡單的解決方案是基於hashids/hashids的項目vinkla/hashids

安裝

composer require vinkla/hashids

我是使用 laravel7 在安裝過程中報錯,
有遇到此問題的小夥伴可以安裝看看版本 8.0.0 試試

composer require vinkla/hashids ^8.0.0

Laravel Hashids 需要連接配置。首先,您需要發布所有供應商資產
php artisan vendor:publish --provider="Vinkla\Hashids\HashidsServiceProvider"

調整配置

config\hashids.php調整參數

更改 salt,可以為目標數字增加變量,確保他人沒有相同的 salt 情況下,無法轉換回數字

更改 length,可以指定轉換後的字符串最小長度

vinkla/hashids 是透過對數字進行編碼形成字符串,當然也可以對編碼過的字符串進行解碼,達成加密數據 ID 的效果

'connections' => [

'main' => [
'salt' => 'example',
'length' => '6',
],

'alternative' => [
'salt' => 'your-salt-string',
'length' => 'your-length-integer',
],

],

基本範例

可以使用php artisan tinker在 shell 中嘗試

In shell

>>> Hashids::encode(1);
=> "E6R3Qg"
>>> Hashids::decode("E6R3Qg");
=> [
1,
]

In controller

use Vinkla\Hashids\Facades\Hashids;

Hashids::encode(1); // 生成E6R3Qg

Hashids::decode('E6R3Qg'); // 解碼後得到數組 [1]

更換不同連接規則

如更改後找不到連接器,清除 config cache,php artisan config:cache

// 使用alternative的配置encode
Hashids::connection('alternative')->encode($id);

// 使用alternative的配置decode
Hashids::connection('alternative')->decode($id);

更改預設連接

預設是使用main的配置

Hashids::getDefaultConnection(); // 會回傳 main.

可以使用以下方法更改預設連接

Hashids::setDefaultConnection('alternative'); // 此時預設會變成 `alternative`.

使用情境

我是使用在 model,增加一個 hashid 的欄位,假如 model 名為 Store,就可以使用Store::find(1)->hashid取得 ID 是 1 的 store hashid

protected $appends = array('hashid');

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