TP框架marketing

如何保护你的数据库主键 - Hashids扩展

时间:2023-03-23 16:47 阅读:889 来源:互联网

谈谈保护数据表主键的必要性

表的主键一般是自增有序的Int类型数字,在项目中非常容易暴露出真实的项目ID,被爬虫抓取,被恶意采集也有可能被人猜到项目的数据量。作为开发者,这是应极力避免。

Hashids是一个小型PHP库,用于从数字生成短小、唯一、非连续标识符。当您不想向用户公开数据库数字标识时,请使用它。

Hashids支持通过生成出来的标识符进行解码为原数字,还支持加盐加密,不会因为大家都用这个类库就被猜到真实ID。

在项目的根目录中需要这个包和Composer。

$ composer require hashids/hashids

然后可以将类导入到应用程序中:

use Hashids/Hashids;
$hashids = new Hashids('this is my salt');
$hashids->encode(1);

注意:hashid需要BC Math或GMP扩展才能工作。

Quick Example

use Hashids/Hashids;
$hashids = new Hashids();
$id = $hashids->encode(1, 2, 3); // o2fXhV
$numbers = $hashids->decode($id); // [1, 2, 3]


More Options

encode()函数传递输入ID的其他几种方法:

use Hashids/Hashids;
$hashids = new Hashids();
$hashids->encode(1, 2, 3); // o2fXhV
$hashids->encode([1, 2, 3]); // o2fXhV
$hashids->encode('1', '2', '3'); // o2fXhV
$hashids->encode(['1', '2', '3']); // o2fXhV


使输出ID唯一

传递项目名称以使输出ID唯一:

use Hashids/Hashids;
$hashids = new Hashids('My Project');
$hashids->encode(1, 2, 3); // Z4UrtW
$hashids = new Hashids('My Other Project');
$hashids->encode(1, 2, 3); // gPUasb

使用填充使输出ID更长

请注意,输出id仅被填充以适合至少一个特定的长度。但这并不意味着它们就那么长。

use Hashids/Hashids;
$hashids = new Hashids(); // no padding
$hashids->encode(1); // jR
$hashids = new Hashids('', 10); // pad to length 10
$hashids->encode(1); // VolejRejNm

使用自定义字母表

use Hashids/Hashids;
$hashids = new Hashids('', 0, 'abcdefghijklmnopqrstuvwxyz'); // all lowercase
$hashids->encode(1, 2, 3); // mdfphx

编码十六进制而不是数字

如果你想编码Mongo的objectid,这很有用。请注意,您可以传递的十六进制数的大小没有限制(它不必是Mongo的ObjectId)。

use Hashids/Hashids;
$hashids = new Hashids();
$id = $hashids->encodeHex('507f1f77bcf86cd799439011'); // y42LW46J9luq3Xq9XMly
$hex = $hashids->decodeHex($id); // 507f1f77bcf86cd799439011

Pitfalls

  1. 解码时,输出总是一个数字数组(即使只编码了一个数字):use HashidsHashids; $hashids = new Hashids(); $id = $hashids->encode(1); $hashids->decode($id); // [1]

  2. 不支持对负数进行编码。

  3. 如果将伪输入传递给encode(),则返回一个空字符串:use HashidsHashids; $hashids = new Hashids(); $id = $hashids->encode('123a'); $id === ''; // true

  4. 不要将此库用作安全措施。不要用它来编码敏感数据。Hashids不是加密库。

Randomness

Hashids的主要目的是混淆数字id。它并不意味着也不被测试为安全或压缩工具。尽管如此,该算法确实试图使这些ID随机且不可预测:

编码多个相同的数字时没有显示模式(下面的示例中显示了3):

use Hashids/Hashids;
$hashids = new Hashids();
$hashids->encode(5, 5, 5); // A6t1tQ

对一系列数字进行编码与单独编码时也是如此:

use Hashids/Hashids;
$hashids = new Hashids();
$hashids->encode(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // wpfLh9iwsqt0uyCEFjHM
$hashids->encode(1); // jR
$hashids->encode(2); // k5
$hashids->encode(3); // l5
$hashids->encode(4); // mO
$hashids->encode(5); // nR