gpt4 book ai didi

mysql - 关于MySql ID列的建议 - Rails

转载 作者:行者123 更新时间:2023-11-29 21:53:01 25 4
gpt4 key购买 nike

在 Rails 应用程序中,不是将默认的 Mysql/Postgres ID 列创建为整数(这很容易在命中路由时猜测下一个数字),而是生成 ID 列(可能是 AlphaNumeric?)的最佳方法是什么?很难猜测。

I did some research on creating UUID's, is this a good option? or, are there any other options?

How about generating EPOCH timestamps and storing them as ID's on before_save callback each time ?

最佳答案

使用 UUID 来覆盖数据库 ID 是模糊安全性的一个示例。

"System security should not depend on the secrecy of theimplementation or its components."

  • National Institute of Standards and Technology

考虑一下攻击者实际上可以利用他对主键的了解来攻击系统的情况 - SQL 注入(inject)(无论如何你都被搞砸了)和暴力攻击。你应该有更好的 guard 。

话虽如此,使用 UUID 是有有效用例的 - 主要的一个是使用顺序自动增量列的分布式数据库容易出现竞争条件。

如果您有多个“写入”复制,则必须采取大量步骤来确保 ID 同步,并且如果将记录同时插入不同的数据库中,则可能会出现问题。

生成唯一 ID 时,应使用冲突几率较低的哈希算法。目前 RFC4122 推荐使用 SHA-1 算法。早期标准使用的方案是生成计算机 MAC 地址与时间戳相结合,但这被认为不够透明 1 .

MongoDB 默认使用 8 位对象 ID 标识符 - 这与它是为复制而构建的这一事实有关。 MongoDB uses the following to construct its object IDs :

  • 一个 4 字节值,表示自 Unix 纪元以来的秒数,
  • 3 字节机器标识符,
  • 2 字节进程 ID,以及
  • 一个 3 字节计数器,以随机值开始。

请注意,这些是由数据库生成的 - 而不是使用数据库的 Web 服务器。

还有several esoteric algorithms旨在具有较高的唯一性,而无需指定密码散列算法,例如 Blowfish .

结论:

如果您可以预见您将遇到需要数据库复制的扩展问题,请使用 UUID。

无论您使用什么算法,都可能足够强大来避免 pigeonhole problems - 但你不应该真正自己动手 - 这个问题已经被广泛研究,并且有许多免费的解决方案可供使用。

安全 yield 充其量也是微不足道的。

关于mysql - 关于MySql ID列的建议 - Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33447260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com