Meteor中的文档ID需要是随机的还是唯一的?

时间:2015-04-22 18:56:06

标签: meteor

我正在从rails系统迁移数据,分配迁移的对象ID(如post0000000000001等)非常方便。

我在这里读到

Creating Meteor-friendly id's in Mongo?

Meteor从

创建随机的17个字符串
23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz

看起来是为了避免可能含糊不清的字符(省略1I等)。

由于某种原因,ID是否需要随机?能够猜出Meteor文档的ID有安全隐患吗?!或者它只是一种生成唯一ID的简单方法吗?

使用顺序ID,Mongo似乎很好:

http://docs.mongodb.org/manual/core/document/#the-id-field http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

所以我猜想如果它存在,那就必须是Meteor约束。

3 个答案:

答案 0 :(得分:2)

ID只需要是唯一的。

通常有一个顺序元素:例如使用整数,时间戳或具有顺序性的东西。

这在Meteor中不起作用,因为插入可以来自客户端,它们可能会断开一段时间,或者客户端时钟可能会关闭/具有不同的延迟。由于延迟补偿(即时插入),在编写_id时也无法知道先前的_id(在顺序_id的情况下)。

DDP协议缺乏秩序的结果是决定使用完全随机的ID。这并不是说你不能使用自己的_ids。

虽然存在与此策略发生冲突的风险,但它在[number of docs in your collection]/[55^17] * 100 %或最不可能的顺序上是最小的。如果发生这种情况,客户端将暂时插入它并在服务器使用Mongo Duplicate Key错误确认错误后取消它。

另外,当涉及安全性时,另一个答案。如果用户的_id已知,那就不是问题了。如果没有有效的哈希登录令牌或使用它检索任何信息,则无法登录。这当然仅适用于用户集合。如果你有自己的集合,一个容易猜到的URL包含一个id作为参考而没有发布方法检查读取数据的资格是一个风险,Meteor生成的高熵随机ID可以缓解。

只要它们是唯一的,就可以使用你自己的ID。

答案 1 :(得分:1)

我不是专家,但我认为Mongo需要一个唯一的ID,因此当它更新文档时,它实际上会创建一个具有相同ID的文档的新版本。

真正的问题是 - 我也不知道 - 如果我们可以在不搞定Mongo机制和可靠性的情况下更改ID,或者我们需要创建辅助属性? (我想它也可以制作一个更小的索引)?

但我也是,我可以想象安全性明智,如果文档ID很难猜测,那就更好了,尤其是用户ID!否则,在知道ID的情况下伪造用户是否容易或可能?任何人,如果我错了,请纠正我。

答案 2 :(得分:1)

我认为从Mongo更改ID是不可能的。

但您可以使用http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

轻松创建自动增量ID
function getNextSequence(name) {
  var ret = db.counters.findAndModify(
      {
        query: { _id: name },
        update: { $inc: { seq: 1 } },
        new: true
      }
 );

 return ret.seq;
}  

我已经创建了一个可以实现的包,并且可以配置。 https://atmospherejs.com/stivaugoin/fluid-refno

var refNo = generateRefNo({
    name: 'invoices', // default: 'counter'
    prefix: 'I-',  // default: ''
    size: 5, // default: 5
    filling: '0' // default: '0'
});
console.log(refNo); // output: "I-00001"

您现在可以使用refNo在插入

上添加文档

也许它会帮到你