如何从 nodejs 模块中删除全局上下文?

Posted

技术标签:

【中文标题】如何从 nodejs 模块中删除全局上下文?【英文标题】:How to remove the global context from a nodejs module? 【发布时间】:2012-12-08 13:07:01 【问题描述】:

关于如何从 nodejs 模块中删除全局上下文有什么想法吗?

我不是在寻找以下问题的解决方案,但如果您需要更多上下文,请前往。

我正在开发一个项目,我的用户可以上传他们自己的 nodejs 模块,如果它符合预定义的框架,它将在一天中定期运行。显然,这是一个主要的安全问题。一个好的 90% 解决方案只是删除全局上下文。

【问题讨论】:

由于 javascript 的特定语义,我不相信这是可能的。 你认为他们为什么会在全球范围内造成伤害?如果您确实需要用户模块,请在它们自己的进程中运行它们,并使用受限的权限(在沙箱中)并且不要忘记超时杀死它们。 Bergi:这可能是解决我的问题的好方法,但我很想知道你现在是否可以限制范围。 @pointy:如何清除模块中的所有全局变量? @mcwhittemore 通过“消隐”我想你的意思是你会声明相对局部的变量。好吧,动态地做到这一点会有些棘手,特别是如果全局状态随着时间的推移而演变和扩展。 (局部变量的名称必须是解析时常量,并且不能将变量添加到范围。) @Pointy 我认为您必须检查全局上下文是否发生更改(也就是添加了新变量),然后在本地上下文中创建一个具有相同名称的变量。也就是说,当然,在您首先使用所有原始全局变量完成此操作之后。我将尝试一下(只是为了好玩)并稍后发布我发现的内容。 【参考方案1】:

如 cmets 中所述,您确实需要在单独的进程中运行用户提供的模块,因为无限循环会冻结任何节点进程。

您应该从VM 模块开始:

读取文件内容(使用fs.readFile,而不是require)。 定义一个新的全局对象。您可以选择公开您想要的任何内容(并隐藏其余内容)。 运行用户代码。

这是一个例子:

var fs = 要求('fs'), vm = 需要('vm'); 函数运行代码(文件名) var 代码 = fs.readFileSync(fileName), 沙箱 = 控制台:控制台, 设置超时:设置超时, 清除超时:清除超时, 要求:要求, 模块:模块, 出口:出口, 过程:过程, 缓冲区:缓冲区 ; vm.runInNewContext(代码,沙箱,文件名);

用户提供的代码将能够访问我在沙箱中传递的所有内容,就好像它在全局范围内一样。在我的例子中,我选择从真正的 node.js 全局范围中公开几乎所有内容。您可以选择不公开的内容。

此外,如果您希望您的解决方案安全,您应该检查child_process.spawn。

【讨论】:

了解有关定义新全局对象的任何教程。 Nodejs 文档有一些不足之处。 我什么都不知道,但我只是编辑了我的答案。如果您需要更多信息,请告诉我。 甜蜜。感谢所有的帮助。 该页面明确显示:The vm module is not a security mechanism. Do not use it to run untrusted code.。您可能可以尝试使用npmjs.com/package/vm2

以上是关于如何从 nodejs 模块中删除全局上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部 api 读取属性并将其设置为 springboot 中的应用程序上下文以使其全局可用?

Kubernetes:如何从 kubectl 配置中删除集群和上下文?

如何从文档中的菜单上下文中删除 git?

如何从 ExitStack 中删除上下文管理器

如何从 Django 模板/上下文中更改为字符串并删除 '?

如何使用 Magical Record 从特定上下文中简单地删除一组实体?