不败君

前端萌新&初级后端攻城狮

给你的PHP项目隐藏主键ID

给你的PHP项目隐藏主键ID

2020-07-21 18:55:00

围观(3902)

在项目开发中, 很多时候会写一些 API 接口, 例如接口会返回这样的数据:

[
    {
        "id": "1",
        "content": "content"
    },
    {
        "id": "2",
        "content": "content"
    }
]

在安全方面考虑, 这样会暴露了主键 ID, 对方可以轻易的知道目前的数据量以及被爬数据会变得很简单.


就如本文的 URL, 主键 ID 是 199 , 如果想要爬整个站点的文章, 直接从 1 开始循环去访问就行了...


所以有这么一个包: hashids https://github.com/vinkla/hashids


可以直接使用 Composer 安装这个包.

博主用 Laravel 安装这个包尝试了一下, 根据文档直接使用:

$hash_ids = new Hashids();
dd($hash_ids->encode(1));   // 输出 jR

仔细看官方文档, 如果仅仅这样使用, 每个 1 都是会输出 jR, 如果爬站的人知道使用了这个包就也能知道实际的主键 ID, 所以需要加盐.


这个包加盐很方便, 他的构造方法已经获取了盐.

也就是说, 只需要这样实例化对象就可以加盐:

$hash_ids = new Hashids('salt,bubaijun.com');
dd($hash_ids->encode(1));

此时输出的结果是 Ry, 即使爬站的人知道用了这个包, 也无法得知解密后的数据.

解码的方法:

$hash_ids = new Hashids('salt,bubaijun.com');
$id = $hash_ids->encode(1);
dump($id);

dd($hash_ids->decode($id));

依次输出为:

"Ry"

array:1 [▼
  0 => 1
]

所以要拿到这个解密后的 ID, 需要加上 0 索引.

$hash_ids = new Hashids('salt,bubaijun.com');
$id = $hash_ids->encode(1);
dump($id);

dd($hash_ids->decode($id)[0]);

则会依次输出为:

"Ry"

1

本文地址 : bubaijun.com/page.php?id=199

版权声明 : 未经允许禁止转载!

评论:我要评论

BBJ不败君 沙发

另外说一下, 这个方法也适用于短链接生成

评论时间:2020-07-22 10:37:44

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语