绑定到node.js+vm2可以帮助您安全地执行javascript。

node-vm2的Python项目详细描述


https://api.codacy.com/project/badge/Grade/fb30c7193b6b43cf818457e3ff23e60cDocumentation Statushttps://travis-ci.org/eight04/node_vm2.svg?branch=masterdependencies Status

python 3到node.js+vm2的绑定可以帮助您安全地执行javascript。

vm2

vm2是在节点中创建real沙盒的节点模块。官方节点api vm,只能创建隔离上下文,不能防止有害代码损坏您的计算机。

工作原理

该模块启动一个node.js repl服务器,该服务器可以与json通信。所有javascript代码都用json编码并发送到服务器。服务器在vm2中执行代码后,将结果发送回python。

安装

你需要node.js。

https://nodejs.org/

从pypi控制盘安装node-vm2。

pip install node_vm2

还要确保在PATH中有node可执行文件,或者可以使用环境变量NODE_EXECUTABLE指定可执行文件。

此外,您还需要npm来从源代码构建节点vm2。

用法

大多数api都绑定到vm2

简单评估:

fromnode_vm2importevalprint(eval("['foo', 'bar'].join()"))

使用虚拟机:

fromnode_vm2importVMwithVM()asvm:vm.run("""
      var sum = 0, i;
      for (i = 0; i < 10; i++) sum += i;
   """)print(vm.run("sum"))

使用nodevm:

fromnode_vm2importNodeVMjs="""exports.greet = name => console.log(`Hello ${name}!`);"""withNodeVM.code(js)asmodule:module.call_member("greet","John")

可以使用promise执行异步任务:

fromdatetimeimportdatetimefromnode_vm2importNodeVMjs="""
exports.test = () => {
   return new Promise(resolve => {
      setTimeout(() => {
         resolve("hello")
      }, 3000);
   });
};
"""withNodeVM.code(js)asmodule:print(datetime.now())print(module.call_member("test"))print(datetime.now())

如果您想让vm使您的服务器崩溃(例如process.exit()),您应该在单独的服务器中创建vm,这样它就不会影响其他vm:

fromnode_vm2importVMServer,VMwithVMServer()asserver:withVM(server=server)asvm:# now the vm is created in a new serverprint(vm.run("1 + 2 + 3"))

更改日志

  • 0.3.6(2019年4月22日)
    • 将vm2更新到3.8.0。解决安全问题。
  • 0.3.5(2019年2月10日)
    • 更新vm2至3.6.10。解决安全问题。
  • 0.3.4(2018年8月10日)
    • 更新vm2至3.6.3。解决安全问题。
  • 0.3.3(2018年7月23日)
    • 修正:不要捆绑开发依赖项。
  • 0.3.2(2018年7月23日)
    • 修复:获取冻结对象会使服务器崩溃。
    • 更新vm2至3.6.2。解决安全问题。
  • 0.3.1(2017年4月25日)
    • commandarg添加到VMServer
    • 修复:如果进程生成失败,将创建一个死的默认服务器。
  • 0.3.0(2017年4月23日)
    • change:使用事件队列处理控制台重定向。
    • 重新确认虚拟机抛出的对象,该对象不继承内置错误。
  • 0.2.0(2017年3月25日)
    • drop nodebridge.
    • 添加vmserver。
    • 使所有vm共享一个默认vmserver。
    • 方法重命名:vm.connect->;vm.create,vm.close->;vm.destroy。
  • 0.1.0(2017年3月23日)
    • 首次发布

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java GridBagLayout不填充区域   java Memozied Fibonacci未运行与常规Fibonacci解决方案   Java Web启动未启动问题   Java中异常和if-then的区别   java从命令提示符运行批处理文件获取错误   socket在Java中验证SSL证书的公共名称   如何在JAVA中检查字符串数组中的相等字   用java语言将音频文件转换成文本文件的语音识别   java为什么foo(1,2,3)没有传递给varargs方法foo(对象…)作为整数[]   java通过蓝牙将奇怪的数据从Arduino传输到Android   java ContainerRequestFilter获取空entitystream   java如何从安卓 studio中删除不兼容类型错误   基本Java错误   在Spring引导中使用REST API时发生java错误   javascript通过从SQL查询派生的URL打开页面