什么是MongoDB中的"JavaScript with Scope"

Cha*_* Su 6 javascript mongodb bson mongo-c-driver

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

我的问题是:

(1)什么是带范围的JaveScript?

(2)它是MongoDB中的某种"内部"数据类型

"内部",我的意思是它不能被用户使用.我没有找到关于这种类型的更多信息,除了上面链接中提到的

(3)在mongo c驱动程序中,我发现了struct bson_value_t http://mongoc.org/libbson/1.0.0/bson_value_t.html 什么是"scope_data"缓冲区?

dus*_*uff 7

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

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

"带闭包的函数"(或更简单地说,"闭包")是一个函数,它引用存在于函数外部的变量,如incrementX下面的代码片段所示:

var x = 1;
function incrementX() { x++; }
Run Code Online (Sandbox Code Playgroud)

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

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

出于某些不可知的原因,BSON设计者决定为Javascript函数使用不同的数据类型,具体取决于它们是否因任何变量而关闭.普通的"Javascript"类型用于不关闭任何变量的函数,"Javascript(with scope)"用于闭包.


为什么要在MongoDB集合中存储Javascript函数是一个很好的问题.我不确定这个功能的用途是什么; 老实说,对我来说,这似乎是相当危险和不明智的.特别是,如果您在非Javascript语言中使用Mongo驱动程序,那么对它们执行任何有用的操作都很困难,并且如果恶意用户能够注入函数,则使用数据库中的函数会向您展示潜在的漏洞利用进入你的数据库.如果我是你,我会假装这个功能不存在并继续前进.

  • @duskwuff哦,不,您的实验出错了吗?您的计算机爆炸了吗?告诉我!怎么了? (3认同)