dragonrun1 / uuid64type
一个使用新自定义紧凑格式用于数据库主键的UUID v4(随机)库。它还包括辅助特性,以简化在Doctrine中的集成。
Requires
- php-64bit: 8.0.*
- ext-mbstring: *
- ext-pdo: >=1.0.0
- ext-pdo_mysql: *
- ext-spl: *
- doctrine/orm: ^2.7
Requires (Dev)
README
一个使用新自定义紧凑格式用于数据库主键的UUID v4(随机)库。它还包括辅助特性,以简化在Doctrine中的集成。
目录
安装
composer require dragonrun1/uuid64type
使用
有关与Doctrine CLI配置集成的示例,请参阅
config/example-cli-config.php
有关在Doctrine项目中使用Uuid64Type的示例,请参阅我在GitHub上的相关项目: person_db_skeleton
请参阅骨架项目中的 config/cli-config.php
了解如何在Doctrine中注册自定义类型,或在此项目中查看 config/example-cli-config.php
。
请参阅骨架项目中 src/Model/Entities/*
表类文件,了解如何使用辅助特性等。
为什么创建这个项目?
已经存在几个优秀的PHP UUID v4(随机)库,因此如果只是这样做的话,再创建一个新的库就没有太多意义。除了UUID之外,这个库还试图解决数据库设计中的限制。接下来,我将详细说明这个库试图克服的数据库限制。
数据库引擎限制
数据库引擎,无论是MySQL、PostgreSQL、SQLite还是任何其他,都有为ID列生成序列的方法。它们如何做几乎和它们自己一样多样化,因为ID生成超出了现有的SQL标准,但结果通常是一样的,那就是你最终得到一个简单的自增整数序列。那么限制在哪里?为什么会这样?两个词:自增和序列。再加上两个词:坏演员。结合这四个词,有些人可能已经看到了可能的问题。接下来,我将展示为什么将坏演员与这两个词结合起来可能会成为一个问题。
自增序列的问题
首先一个问题给你。你有多少次直接在互联网上的表单中暴露数据库表ID?如果你像我一样的大多数开发者,我想我们至少做过一次。我们可能把它做成一个隐藏字段,但任何人直接查看页面代码都能一目了然。现在让我们思考一下自动增长的序列以及它对我们底层数据库表能告诉我们什么。序列的通用默认值是它们从1开始,每增加一行就增加1。通过使网站向表中添加一行并查看该新行,我们可以很好地猜测表中有多少行,通过添加第二行,我们可以很好地猜测它的增长速度。这些信息有什么用?如果表存储的是用户账户,而账户ID是他们的账户ID呢?现在他们有了一些想法,知道在数据泄露中他们可以得到多少实际用户账户,或者哪些账户可能被攻击。假设他们只得到用户名列表,ID,他们应该先攻击哪个?我会先攻击最早创建的账户,因为它们很可能是具有更高访问权限的管理员或测试账户。我相信你一定能想到很多其他简单递增序列可能被攻击的方式,在你指出风险之前你可能从未想过。
自定义的UUID v4(随机)的base 64编码。
预期的用途是在Doctrine实体中使用,而不是使用自动增长的ID。
UUID是128位长的二进制数,大多数编程语言只能以某种字符串或整数数组格式支持它。最常用的二进制字符串用于紧凑性,其中字符串可以包含(空)字符。这种格式通常只在创建UUID的函数中看到,因为它很难让程序员轻松地可视化。通常格式化的字符串版本有36个字符,或者作为32个字符的十六进制字符串更常见。这两种格式都是通过牺牲两倍或更多的内存使用来换取更容易处理。通过使用base 64编码,它比二进制字符串(16个字符)增加了不到40%的内存使用(22个字符)。
所以总的来说,使用这种自定义base 64编码格式的优点如下
- 数据库兼容 - 可以直接存储在任何以下字段类型中:VARCHAR、CHAR、BINARY等。
- URL兼容 - 不包含任何在URL中需要特殊转义的字符。
- HTML兼容 - 不包含任何在HTML表单或属性值中需要转义的特殊字符。HTML 5放宽了所有ID属性值必须以字母开头的规则。
- 更易于阅读 - 由于base 64比其他格式短,大多数人发现它更容易阅读。
- 最佳的内存与速度权衡 - 二进制字符串占用的内存最少,但需要在URL等中使用时将其转换为其他格式,这可能会引起不必要的服务器负载问题。常规和十六进制形式都更长,这增加了内存和服务器负载问题。自定义格式找到了一个甜点,在那里不需要进行转换,也不会占用太多的额外空间。
相关项目
https://github.com/Dragonrun1/uuid64ts 我开始了 uuid64ts 项目,将其从TypeScript转换成这个项目,但在这个过程中,在1.0版本代码中暴露了问题/错误之后,它最终也反馈到了2.0版本。
https://github.com/Dragonrun1/person_db_skeleton 此项目与本项目并行开发至1.0版本。它们都基于观察到许多先前项目似乎都需要某种人员对象的相同通用需求。我决定不再重复创造,而是制作出易于在所有未来项目中重复使用的工具。
贡献
欢迎贡献者。请注意,本项目遵循贡献者行为准则。参与本项目即表示您同意遵守其条款。
所有有意贡献的代码都将被视为在相同的BSD-3-Clause许可下贡献,不附加任何额外条款或条件。请在所有代码文件中添加您的信息作为注释,以示版权等。
所有有意贡献的文档或非代码文本,如本README等,都将被视为在相同的CC-BY-SA许可下贡献,不附加任何额外条款或条件。
欢迎提交拉取请求。对于重大更改,请先打开一个问题来讨论您希望更改的内容。请确保适当地更新或添加测试。
许可协议
所有代码均受BSD-3-Clause许可协议的保护。您可以在LICENSE-BSD文件中找到许可证的副本。所有如本README的文档均受创意共享署名-相同方式分享4.0国际许可协议(CC-BY-SA)的保护。您可以在LICENSE-CC-BY-SA文件中找到CC-BY-SA许可证的副本。
版权所有 © 2019-至今,Michael Cummings