隐藏你的 ID 吧!
32

hyid

hidden your id. 隐藏你的ID.

使用场景

当我们的应用需要提供一个无状态通过ID获取信息的接口,例如 GET /user/{id} ,此类接口只要递增ID进行请求,就可以得到我们数据库中所有公开信息,这很显然不是我们想看到的。
hyid 可以帮助你隐藏我们不希望用户看到的ID字段,或者其他数字字段。

安装

composer require 96qbhy/hyid

laravel or lumen

  1. 注册服务提供者 : Qbhy\Hyid\ServiceProvider::class
  2. 发布配置文件(lumen可以自行复制 config/hyid.php 或者安装 vendor:publish 命令): php artisan vendor:publish --provider=Qbhy\Hyid\ServiceProvider

使用

class User extends Model{
    use Qbhy\Hyid\HyidAble;

    // or 
    public function getUserId($userId){
        return hyid($userId);
    }

    // or
    public function toArray(){
        $data = parent::toArray();

        $data['id'] = hyid()->encode($data['id'])

        return $data;
    }
}
// decode
    public function userinfo($id){
        return User::query()->findOrFail(hyid()->decode($id))->toArray();
    }
// 非 laravel or lumen 下,可以自行实例化 Hyid 类
$secret = 'qbhy';
$offset = 1996;
$randomLength = 6;
$hyid = new Hyid($secret,$offset,$randomLength);

$encodedId = $hyid->encode(1);
$id = $hyid->decode($encodedId);

96qbhy@gmail.com
qbhy/hyid

桥边红药

本帖由系统于 1个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 15
96qbhy

该方法可以很好的隐藏数据库内原始 ID 值,防止不法分子利用接口恶意获取数据。

1个月前
overtrue

我是直接将模型的 routeKey 改成了 username.

1个月前
96qbhy

@overtrue username 加唯一索引确实可以的,但是数据大了还是 ID 比较好。

1个月前

和hashid一样吧

1个月前
96qbhy

@fun206 看了下hashids,功能好像确实是差不多

1个月前
godruoyi

用的是 base64_encode,当 id 数值很大的时候, encode 的值也很长一串,不支持固定长度的 encode 啊

1个月前

ID直接用 uuid

1个月前

楼主也太大意了,composer require 96qbhy/hyid这也写错了,我说怎么安装不了

1个月前
Janpun

@godruoyi 固定长度理论上是不可逆的,因为密文数量有限,而原文数量无限,存在一个密文多个原文的可能

1个月前
96qbhy

@lovecn 谢谢提醒

1个月前
96qbhy

@Janpun 嗯,还有改进的空间

1个月前
MrCong

在使用了 laravel-ide-helper 进行 php artisan ide-helper:meta 的时候报错了。

Symfony\Component\Debug\Exception\FatalThrowableError  : Argument 1 passed to Qbhy\Hyid\Hyid::__construct() must be of the type string, null given, called in  /data/www/vendor/96qbhy/hyid/src/ServiceProvider.php on line 37

  at  /data/www/vendor/96qbhy/hyid/src/Hyid.php:43
    39|      * @param string $secret
    40|      * @param int    $offset
    41|      * @param int    $randomLength
    42|      */
  > 43|     public function __construct(string $secret, int $offset, int $randomLength = 4)
    44|     {
    45|         $this->secret       = $secret;
    46|         $this->offset       = $offset;
    47|         $this->randomLength = $randomLength;
  Exception trace:
  1   Qbhy\Hyid\Hyid::__construct()
       /data/www/vendor/96qbhy/hyid/src/ServiceProvider.php:37
  2   Qbhy\Hyid\ServiceProvider::Qbhy\Hyid\{closure}(Object(Illuminate\Foundation\Application), [])
      /data/www/vendor/laravel/framework/src/Illuminate/Container/Container.php:776
  Please use the argument -v to see more details.
4周前
96qbhy

@MrCong 配置没问题吗? must be of the type string, null given。这个错误的意思是你传了错误的参数类型,看看 env 有没有添加 HYID_SECRETHYID_OFFSET

4周前

base64?

1周前

个人建议直接用uuid

1周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!