gpt4 book ai didi

ruby-on-rails - 随机化数据库记录 ID

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

在我们的 Web 应用程序中,我们希望随机化记录 ID。原因是因为我们想隐藏数据库中已经有多少条目,并且我们有未列出的东西。如果 ID 是简单的递增数字,则很容易猜出未列出事物的 ID。

在我看来,有三种方法可以做到这一点:

简单随机数

算法:

  1. 在插入时创建一个随机数。
  2. 检查该 ID 是否已被使用。如果是,转到 1。
  3. 使用此 ID。

专业版

  • 简单
  • 适用于任何大小或类型的 ID(32 位、64 位、可变长度、字符串)

魂斗罗

  • 需要针对可能的竞争条件进行交易(算法不是原子的)

UUID

专业版

  • 发生碰撞的可能性很低,您可以忽略它

魂斗罗

  • 我们希望有漂亮的短 URL,其中页面标题作为 URL 注释 ("#{id}--#{page_title}),UUID 会将此注释一直转移到对
  • 我猜 UUID 作为主键在连接时的性能会较低吗?

加密ID

算法:

  1. 使用nextval(原子!)从序列中读取数字
  2. 使用 key 和适用于 ID 大小的加密算法对 ID 进行加密

专业版

  • 无竞争条件(无需交易)

魂斗罗

  • ID 列的大小永远不能改变
  • 如果有人能破解/猜出 key 一切都是徒劳的

时间戳

@emboss 建议

专业版

  • 简单
  • 不会用完 ID

魂斗罗

  • 可能会产生碰撞(尽管需要测试它是否真的发生了)
  • 可能有点猜到

随机公共(public) ID/基于名称的公共(public) ID

@viktor tron 建议

URL 中出现的所有事物的第二个 ID,仅用于查找记录。使用内部普通 ID(用于连接等)。

专业版

  • 内部一切都保持正常
  • 一个好的随机算法/命名方案应该使 URL 猜测不可能(足够)

魂斗罗

  • 改变很多在公共(public)接口(interface)中使用 ID 的东西
  • 用户可能希望他们可以减少其中包含此类标题的 URL,但在这种情况下,这些 URL 将不再有效

我想我会使用第三个选项。还是有更多反对意见?有更好的解决方案吗?我们使用 Ruby on Rails 3.x 和 PostgreSQL 9.x。

编辑: 不公开不代表私密!它的意思就像 YouTube 上未列出的视频。它们是普通视频,只是未在搜索或上传者的个人资料中列出。因此您无法真正找到它们(不尝试所有可能的 ID),但是知道 URL 的每个人都可以访问它们。当然,将某些内容设为未列出并将链接发送给其他人的用户必须意识到它可能不会一直不为人知(URL 可能会被传递并且通过链接可能最终出现在搜索引擎中)。

我们还有另一种选择,可以将内容设为私有(private)。这是两个不同的东西。 (我认为假设每个人都知道“未列出”是什么意思是错误的。)

最佳答案

注意:这回答了问题的初始版本,从中看不出这不是授权逻辑的替代品。


这是针对错误问题的错误解决方案。

你认为问题是:用户可以猜测“未列出”的东西的 id 并使用它们。

实际问题是:用户可以在未经授权的情况下访问。

设置授权逻辑,只允许用户访问他可以合法访问的项目并禁止其他所有内容。

还有

hide how many entries there are in the DB

如果是这个原因的话,我认为变小并不可耻。无论如何,你可以从 100000 开始你的序列,或者将它递增 N,或者使用另一个类似的技巧 :)

关于ruby-on-rails - 随机化数据库记录 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785814/

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