Mar*_*ner 9

一般来说,我认为您应该谨慎地向客户端公开内部(例如DB ID).可以轻松地操纵URL,并且用户可以访问您不希望他拥有的对象.

对于特殊的MongoDB,对象ID甚至可能会显示一些额外的内部(参见此处),即它们不是完全随机的.这可能也是一个问题.

除此之外,我认为没有理由不使用id.


Dan*_*n H 7

我普遍同意@ MartinStettner的回复.我想补充几点,主要是详细阐述他所说的话.是的,可以从ObjectId解码少量信息.如果有人将其识别为MongoDB ObjectID,则可以轻松访问.两个缺点是:

  • 它可能允许某人猜测不同的有效ObjectId,并请求该对象.
  • 它可能会显示有关记录的信息(例如其创建日期)或您不希望有人拥有的服务器.

第一项的"正确"修复是实现某种真正的访问控制:1)用户必须使用用户名和密码登录,2)对象与该用户名相关联,3)应用程序仅提供对象与该用户名关联的用户.

MongoDB本身并不这样做; 你将不得不依赖其他手段.也许你的web-app框架和/或一些临时访问控制列表(它本身可能在MongoDB中).

但这里有一个"快速修复",主要解决这两个问题:根据一个大的,高质量的随机数为记录创建一些其他"id".

"大"需要多大?128位随机数具有3.4*10 ^ 38个可能的值.因此,如果您的数据库中有10,000,000个对象,则猜测有效值的人概率很小:3.4*10 ^ 31中的1.还不够好?使用256位随机数...或更高!

如何在文件中表示这个数字?您可以使用字符串(将数字编码为十六进制或base64)或MongoDB的二进制类型.(请参阅驱动程序的API文档,以了解如何将二进制对象创建为文档的一部分.)

虽然您可以在文档中添加一个新字段来保存它,但您可能还需要一个索引.因此文档大小更大,并且您在该索引上花费更多内存.以下是您可能没有的内容:只需将"真正随机ID"用作您的文档"_id"字段.因此,每个文档的大小只有一点点,你使用你[可能]在那里的索引.