我希望能够让用户提交任意JavaScript代码,然后将其发送到Node.JS服务器并安全地执行,然后再将输出发送回多个客户端(如JSON)。该eval
功能浮现在脑海,但是我知道这涉及多个安全问题(用户提交的代码将能够访问Node的File
API等)。我已经看到了一些项目,例如Microsoft Web Sandbox和Google
Caja,它们允许执行经过清理的标记和脚本(用于在网站上嵌入第三方广告),但是似乎这些是客户端工具,我不确定它们是否可以在Node中安全使用。
有没有一种标准的方法来沙盒化并在Node中执行不受信任的JavaScript,以获取输出。尝试在服务器端进行操作是错误的吗?
编辑: 用户能否利用JavaScript的全部功能并不重要,实际上最好能够选择要提供给用户代码的API。
编辑: 我将继续并用我发现的内容进行更新。这个Sandcastle模块(
bcoe/sandcastle
)似乎旨在实现我的想法。不知道它的安全性如何,但是由于我并没有那么重要,我想我会尝试的。如果能够成功完成,我将添加自己的答案。
由于gf3无法提供防止沙箱损坏的保护,因此此答案已过时
http://gf3.github.io/sandbox/-它require('child_process')
代替require('vm')
。
问题内容: 在node.js中安全地运行(可能是恶意的)用户提交的脚本有哪些选项?是否在防止代码访问敏感数据和API的环境中? 是一个诱人的起点…但是似乎那里存在已知问题。 在沙箱模块看起来很有趣,但使用也使我的有点持怀疑态度。 问题答案: 您应该始终在单独的过程中运行不受信任的代码,这正是沙盒模块所做的。一个简单的原因是它将冻结节点。 它从产生一个单独的进程开始,随后将在其stdout上将序列化
问题内容: 我正在创建要执行的JEXL脚本的沙箱,以使恶意用户无法访问我们为其提供访问权限的变量之外的数据,也无法在服务器上执行DOS攻击。我想为其他这样做的人提供文档,也让其他人对此方法有所投入。 以下是我知道需要解决的问题的列表: 仅允许使用白名单上的“ new”实例化类。 不允许访问任何类的getClass方法,因为这样便可以调用forName并且可以访问任何类。 限制对文件等资源的访问。
问题内容: 我需要创建环境来运行可能不受信任的代码。程序允许连接到预配置的地址:端口,而无其他要求(甚至读取系统时间)。我已经编译了班白名单。我搜索了类似的问题,但仅找到基于不推荐使用AFAIK的SecurityManager的模板。有人可以给我一个简单的示例,如何基于安全策略和AccessController在沙箱中运行代码吗? 问题答案: 据我所知,仍然是运行安全检查的SecurityMana
安全是Chromium最重要的目标之一。安全的关键在于理解下面这点:在我们完整地理解了系统在所有可能的输入组合下表现出的行为之后,我们才能够真的保证系统安全。对于像Chromium这样庞大而多样化的代码库,推理它的各个部分可能的行为的组合几乎是不可能的。沙箱的目标是提供这样一种保证:不论输入什么,保证一段代码最终能或不能做的事情。 沙盒利用操作系统提供的安全性,允许不能对计算机做出持久性改变或者访
Jinja2 沙箱用于为不信任的代码求值。访问不安全的属性和方法是被禁止的。 假定在默认配置中 env 是一个 SandboxedEnvironment 实例,下面的代码展示 了它如何工作: >>> env.from_string("{{ func.func_code }}").render(func=lambda:None) u'' >>> env.from_string("{{ func.fu
Jinja2 沙箱用于为不信任的代码求值。访问不安全的属性和方法是被禁止的。 假定在默认配置中 env 是一个 SandboxedEnvironment 实例,下面的代码展示 了它如何工作: >>> env.from_string("{{ func.func_code }}").render(func=lambda:None) u&"" title="jinja2.sandbox.Security