18

根据 MongoDB文档,不建议使用服务器端存储函数。这个警告背后的原因是什么?

4

1 回答 1

21

尽管 Google 搜索结果中只填满了告诉您如何操作的人,但我确信我已经多次说明了该列表:

  • 这是eval
  • eval具有易于注入的自然能力,它就像 SQL 的非 PDO 等价物,如果你不围绕它构建一个完整的转义库,它会搞砸你。通过使用这些函数,您可以有效地将更安全的本地语言 MongoDB 替换为与任何旧 SQL 一样不安全的东西。
  • 它需要一个全局锁,可以带写锁,直到操作完成后才会释放,不像其他操作在某些情况下会释放。
  • eval仅适用于Primaries,而不适用于副本集的任何其他成员
  • 它基本上是在一个捆绑的 V8/spidermonkey 环境中运行的、未经检查的大量 JS,它与 MongoDB 一起提供,完全能够触及数据库的任何部分和管理命令,这听起来安全吗?
  • 它不是 MongoDB,也不是“MongoDBs SQL”,它在内置的 JS 环境中运行,而不是 MongoDBs C++ 代码本身(与聚合框架不同)。
  • 由于前一点,与许多其他选项相比,它非常慢,这也适用于$where使用。

这应该足以让你在这方面开始。

于 2013-03-27T13:40:16.810 回答