如何从 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 配置中删除集群和上下文?