【问题标题】:What is "JavaScript with Scope" in MongoDB什么是 MongoDB 中的“JavaScript with Scope”
【发布时间】:2016-08-26 08:20:15
【问题描述】:

在以下链接中 https://docs.mongodb.com/manual/reference/bson-types/ 它提到带有 Scope 的 JavaScript 是文档中一种可能的数据类型。

我的问题是:

(1) 什么是带作用域的 JavaScript?

(2) 是 MongoDB 中的某种“内部”数据类型

“内部”是指用户不能使用它。 除了上面链接中提到的以外,我没有找到有关此类型的更多信息

(3) 在mongo c驱动中,找到了Struct bson_value_t http://mongoc.org/libbson/1.0.0/bson_value_t.html 什么是“scope_data”缓冲区?

【问题讨论】:

标签: javascript mongodb bson mongo-c-driver


【解决方案1】:

信不信由你,可以在 MongoDB 集合中存储“实时”Javascript 函数:

> db.collection.insert({ name: "add1", f: (function(x) { return x + 1 }) })
WriteResult({ "nInserted" : 1 })
> db.collection.findOne({ name: "add1" }).f(123)
124

“带闭包的函数”(或更简单地说,“闭包”)是指代存在于函数之外的变量的函数,如以下 sn-p 中的incrementX

var x = 1;
function incrementX() { x++; }

这些函数也可以存储在 MongoDB 集合中;它们在执行时将绑定到 mongo 会话的范围:

> db.collection.insert({
    name: "incrementX",
    f: (function() { x++; })
})
WriteResult({ "nInserted" : 1 })
> var x = 123;
> db.collection.findOne({ name: "incrementX" }).f()
> x
124

由于一些不为人知的原因,BSON 设计者决定为 Javascript 函数使用不同的数据类型,具体取决于它们是否被任何变量封闭。普通的“Javascript”类型用于不关闭任何变量的函数,“Javascript (with scope)”用于闭包。


为什么要将 Javascript 函数存储在 MongoDB 集合中是……一个好问题。我不确定这个功能的目的是什么;老实说,这对我来说似乎相当危险和不明智。特别是,如果您使用非 Javascript 语言的 Mongo 驱动程序,则很难对它们做任何有用的事情,并且如果恶意用户能够注入函数,则使用数据库中的函数会使您面临潜在的攻击进入你的数据库。如果我是你,我会假装这个功能不存在并继续前进。

【讨论】:

  • 我也是这么想的,但是如果您尝试使用 {f: {$type: 15}}(带有作用域的 JS)查询该 incrementX 文档,它不会找到它,但 {f: {$type: 13}}(JS)会。跨度>
  • 将闭包重新定义为当前上下文似乎更加可怕。
  • @Bergi 确实如此。我会特别担心如果一个函数覆盖了像db这样的全局变量会发生什么...
  • @JohnnyHK 嗯,很奇怪。也许“带闭包”专门用于关闭全局范围以外的功能?让我尝试一下。
  • @duskwuff 哦不,你的实验出错了吗?你的电脑爆炸了吗?告诉我!会发生什么?
猜你喜欢
  • 2014-01-19
  • 2011-06-19
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2013-09-07
  • 2015-01-26
相关资源
最近更新 更多