我非常喜欢MongoDB自动生成的ID.它们非常有用.
但是,是否可以公开使用它们?
假设有一个帖子集合,以及带有id paramater的/ posts页面(类似于/ posts/4d901acd8df94c1fe600009b)并显示有关它的信息.
这样,用户/黑客将知道文档的真实对象id.它没关系还是不安全?
谢谢
Luk*_*rer 36
所述的ObjectID文档指出自动生成的ID包括一个3字节的机器ID(可能的MAC地址的散列).通过比较各种ID中的这三个字节,有人可以找出有关内部网络的信息,这是不可想象的,但除非你为五角大楼工作,这似乎并不值得担心(你更容易受到攻击)像配置错误的Apache更无聊的东西).
除此之外,Epcylon的权利; 通过URL公开id没有任何内在的不安全因素.当然,它是否丑陋是另一回事.你可以用它们来缩短它们(我自己一直在想这个),但是有一个奇怪的事实,它们都差不多都是一样的.
Lao*_*tih 16
从版本MongoDB 3.4开始,MongoDB 不再包含像标记答案那样的机器标识符。但 id 仍然包含一个timestamp可用于查找数据创建时间的。如果您不希望ID存储与人们可用于映射数据的数据相关的任何信息,您可以按照我的操作进行操作。
我在生产阶段使用过MongoDB。在我的系统上,一般来说,所有 MongoDB 文档都有 2 个唯一的 ID。
第一:默认MongoDB _id(由MongoDB自动生成)
_id:(默认)我用这个ID在内部系统中查询。例如用于 之间的关系collection、缓存等的示例。使用 查询ObjectId比查询其他数据类型(例如string.
第二:公共ID(由您的应用程序生成)
pubId - 你可以用任何东西替换它。(仍请确保使用相关且简洁的名称)UUID)A-Za-z0-9_-)当数据导出并由客户端应用程序使用时,我使用它作为主 ID 。例如,之间的数据输入和退出APIs、与第三方应用程序的集成、作为客户端应用程序中表中的行的 id 元素等。
小智 7
我认为mongodb _id是基于日期戳,服务器地址和其他你可能希望保密的东西.
如果您担心可能需要加密mongoids并将结果用作客户端标识符(然后在请求返回时取消加密).
如果加密密钥部分地基于所讨论的用户或会话的某些唯一属性,则这使得用户难以在不应该访问内容时访问内容.
通过其他方式验证用户显然仍然很重要!
我没有在生产环境中使用MongoDB的经验,所以不要把我的答案当作事实,但我无法想象它为什么不安全.
与RDBMS中的Auto-ID类型列进行比较.你总是将它们暴露在外面,我不知道有什么理由不对MongoDB id做同样的事情.
与往常一样,安全性应该是验证您的输入,而不是让没有适当保护的数据库附近的任何人.做得恰当,如果他们知道如何选择数据库中的特定对象应该无关紧要,因为他们仍然无法对其进行任何操作.
也许这更像是一种隐私而不是安全问题。
我面临着完全相同的问题。在基于 Mongo 生成的 ID 将用户贡献的内容存储在 Web 可访问目录中时,如果这些 ID 是可预测的,一个用户可以访问另一个用户的内容,则存在风险。
我认为其他人的建议是正确的路线:知道特定于用户的私人内容的 URL应该不足以访问它。尝试访问应该检查匹配的用户是否发出请求。
我打算通过存储用户内容为此在Symfony2的外部Web根的,则允许经由一个新的路由/控制器,其使所述反应之前将验证有关用户的一些识别信息访问它。