首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用模块_compile时,vm runInNewContext不执行代码

是因为在Node.js的vm模块中,runInNewContext方法默认不执行代码,而是返回一个可执行的函数。

vm模块是Node.js中的一个内置模块,用于在一个单独的沙箱环境中执行JavaScript代码。其中的runInNewContext方法可以在一个新的上下文中执行代码,并返回执行结果。

当使用模块_compile时,可以通过传递一个自定义的上下文对象来执行代码。但是需要注意的是,默认情况下,runInNewContext方法不会直接执行代码,而是将代码编译为一个可执行的函数,并返回该函数。

如果希望执行代码,可以通过调用返回的函数来实现。例如:

代码语言:txt
复制
const vm = require('vm');
const code = 'console.log("Hello, World!");';
const context = { console };
const script = new vm.Script(code);
const compiledScript = script.runInNewContext(context);
compiledScript();

在上面的例子中,我们定义了一个代码字符串code,然后创建了一个上下文对象context,其中包含了console对象。接着,我们使用vm.Script类将代码编译为一个可执行的函数,并将上下文对象传递给runInNewContext方法。最后,通过调用返回的函数,即可执行代码并输出"Hello, World!"。

需要注意的是,runInNewContext方法的第二个参数可以用于指定是否启用沙箱模式,以及是否启用全局变量。在默认情况下,沙箱模式是启用的,全局变量是禁用的。如果需要启用全局变量,可以将第二个参数设置为true。

总结起来,使用模块_compile时,vm runInNewContext不执行代码,而是返回一个可执行的函数。如果需要执行代码,可以通过调用返回的函数来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

哭了,21k Star 的 Yapi 被黑客入侵了

事情是这样的,由于我们项目使用了这个 Yapi 项目,前几天收到了安全组的预警通知,说 Yapi 被爆出了安全漏洞,新注册的用户,可以在你的服务器执行任意代码,删除任意东西,让我紧急修改!!...而修复这个漏洞的主要代码就是使用了 safeify 替换了Node.js的 vm ?...vm模块不是一种安全机制。不要使用它来运行不受信任的代码。 通俗的理解就是它能够动态的执行一些 JavaScript 代码(和 eval 、Function 有些类似)。...那当然是有的了,首先 eval 最大问题就是侵入性问题,因为 eval 的执行会侵入我当前的代码。而 vm 则提供了一种更加安全的沙盒环境。...先来看一段代码 const vm = require('vm'); vm.runInNewContext('this.constructor.constructor("return process")(

66620

服务端渲染SSR及实现原理

结合 Vue 的钩子来说,能在 SSR 中调用的生命周期只有 beforeCreate 和 created,这就导致在使用三方 API 必须保证运行不报错。...Client entry 和 Server entry 中编写代码逻辑的区分有两条原则 通用型代码 可通用性的代码,由于鉴权逻辑和网关配置不同,需要在 webpack resolve.alias 中配置不同的模块环境应用...创建沙盒 vm,实例化 Vue 的入口文件 var vm = require('vm'); // 调用 createBundleRunner 函数实例对象,rendererOptions 支持可配置 var...而不是在上重新评估整个捆绑包 模块评估成本较高,但需要结构化源代码 once: 初始上下文模式 仅用于收集可能的非组件 vue 样式加载程序注入的样式。...: false }.' ) } } 应用输出 在应用输出这个阶段中,SSR 将更多侧重加载脚本内容和模版渲染,在模版渲染代码中是否定义过模版引擎源码将提供不同的 html

2K10
  • 说说JS中的沙箱

    1、jsonp:解析服务器所返回的jsonp请求,如果不信任jsonp中的数据,可以通过创建沙箱的方式来解析获取数据;(TSW中处理jsonp请求,创建沙箱来处理和解析数据); 2、执行第三方js:...方法时候,允许配置runInNewContext为true或false的形式,判断是否传入一个新创建的sandbox对象以供vm使用; 5、vue模板中表达式计算:vue模板中表达式的计算被放在沙盒中,...3、nodejs中的沙箱 nodejs中使用沙箱很简单,只需要利用原生的vm模块,便可以快速创建沙箱,同时指定上下文。...) 通过上面这段代码,我们可以通过vm,停止掉主进程nodejs,导致程序不能继续往下执行,这是我们希望的,解决方案是绑定好context上下文对象,同时,为了避免通过原型链逃逸(nodejs中的对象并没有像浏览器端一样进行结构化复制...总结 即使我们知道了如何在开发过程中使用沙箱来让我们的执行环境不受影响,但是沙箱也不一定是绝对安全的,毕竟每年都有那么多黑客绞尽脑汁钻研出如何逃出浏览器沙箱和nodejs沙箱,因此笔者个人建议: 1、业务代码执行不可信任的第三方

    2.6K30

    node核心模块-vm

    意思就是:vm可以使用v8的Virtual Machine contexts动态地编译和执行代码,而代码执行上下文是与当前进程隔离的,但是这里的隔离并不是绝对的安全,不完全等同浏览器的沙箱环境。...例子 vm使用很简单,下面是几个例子: vm.runInNewContext const vm = require('vm'); const sandbox = { a: 1 }; // 在新的上下文运行...('a += 1'); console.log(global.a);// 2 使用场景 我个人理解vm使用场景有2个: 环境隔离:因为node的js代码是单线程,在并发的场景下,需要考虑上下文的竞争和互相影响...vue ssr在2.3.0以前,就是用vm来做隔离的渲染的,但是也带来了性能的问题,具体可以查看文档的介绍。 动态执行字符串代码:这在某些需求场景下只能使用vm。...maybe attackedvm也存在安全问题,对于执行外部的代码,可能引发安全问题。

    59420

    JavaScript中的沙箱机制探秘

    这个概念也会被引用至模块化开发的设计中,让各个模块能相对独立地拥有自己的执行环境而互相干扰。随着前端技术的发展以及nodejs的崛起,JavaScript的模块化开发也进入了大众的视线。...之后调用模块代码如下: use: function() { var args = SLICE.call(arguments, 0), callback = args[args.length...需要提及的是,这里的origin使用"*"的原因和上文的null origin一样,在缺少"allow-same-origin"iframe并不具备origin,因此只能通过发送给所有origin来传达消息...Nodejs中的沙箱 服务器端中,nodejs也提供了VM模块来对js代码进行独立的编译和运行,我们也可以利用这个模块来实现沙箱。...模块提供的runInNewContext接口,可以指定某一段代码在某一个sandbox对象中执行,而在不同的sandbox中,上下文环境是相对独立的,我们可以看到执行过后sandbox1和sandbox2

    2.8K31

    14W 行代码量的前端页面长什么样

    对于 SSR 来说就很怕这种自执行的逻辑,因为如果模块里有不支持 Node 环境的代码,意味着你要么得改模块,要么不用,而不能只是屏蔽初始化。...总结一下背景的话: vm执行代码可能来自于第三方,但是整个项目是提供基础镜像,第三方基于镜像自行部署的,因此不关心 vm 里的代码安全问题,不用用到 vm2 vm 里的代码是有可能出错的,错误可能来自于同步代码...、异步代码或者未处理的 Promise 错误 vm 代码是异步并行的,假设每次执行 vm 代码都有一个 id vm 里的代码即使出错,也必须要知道是哪个 id 的 vm 代码执行出错了,来执行兜底的策略...flag 错误值的 循环内的 vm 执行,filename 设置的 0 - 3 结果:编译后的代码实例并不会因为使用 cachedData 重新编译后,filename 就会被改变,因此就无法使用 cacheData...webpack-node-externals 来排除 node_modules 模块,并且我们自己的模块排除。

    1.7K41

    一个有趣的内存泄漏案例

    console 对象上; 在同一段代码多次执行的情况下,也就意味着这几次执行环境是共享 console 对象的,而在浏览器环境下,刷新页面后,代码被多次执行,环境都是独立的; ?...理想的一个引用模型应该是无论 vm 代码执行了多少次,在我们取值和赋值操作应该做到: 取值操作始终取的是原生的 error 方法,因为如果取到了上次运行赋值的方法,那么就会存在引用关系; 赋值操作将不能操作到宿主环境的...console 对象,因为这样将会影响到其他批次 vm 里的全局 console 对象; 赋值操作后的取值操作将需要取到赋值后的方法,这样才能执行到自定义的逻辑; 这其实就要求我们不仅对 vm 的上下文做隔离...假设我们很清楚的认识到代码执行环境(多次执行且共享宿主对象),那么只需要做个标志位防止多次执行就可以了: const nativeError = console.error; if (!...拦截的 set 方法里判断了 store 里已经有存储了被引用的对象,同时当次操作的 key 值也已经被引用过了,因此判定在 vm 这样多次执行的环境里,可能存在内存泄漏,打印出告警信息; 这样我们就可以在开发阶段部署这样内存检测代码

    51410

    NPM酷库:vm2,安全的沙箱环境

    今天我们要了解的库是 vm2,这是一个Node.js 官方 vm 库的替代品,主要解决了安全问题。 不安全的vm 在Node.js官方标准库中有一个vm库,用来在V8虚拟机环境中编译执行JS代码。...通常,我们用vm库来实现一个沙箱,在代码主程序之外执行额外的JS脚本。...有时,我们需要vm虚拟机来执行不受信任的代码,这些代码可能是由用户提交的,比如在脉冲云接口文档管理中,允许用户提交Mock.js脚本生成模拟接口数据。...上述代码执行时,程序在第二行就直接退出,vm虚拟机环境中的代码逃逸,获得了主线程的 process 变量,并调用 process.exit(),造成主程序非正常退出。...vm不安全的原因 上文中的代码使用runInNewContext函数简写,等价于如下代码: 从代码中得知,创建vm环境,首先要初始化一个对象 sendbox,这个对象就是vm中脚本执行时的全局环境Context

    1.8K50

    Linux 上使用 crontab 设置定时任务及运行 Python 代码执行的解决方案

    使用 Linux 或者 Windows 的时候,我们有可能需要去定时运行一些代码,比如在每个凌晨备份一下数据库,如果这些操作都由人工控制就显得太傻了,使用 Linux 的 crontab 设置定时任务是一个非常不错的选择...,这里直接使用的 shell 命令,一般情况下可以把要执行的具体的命令写到 shell 脚本文件中,然后在任务中执行脚本就行了。...参数的使用语法 * 星号,表示任意时刻,列入表示每分钟执行一次,可以这样写: * * * * * command , 逗号,可以表示分时段,如要表示每天的3、6、9点执行,则可以使用: 0 3,6,9...n个单位时间执行一次,比如要表示每10分钟执行一次可以这样写: */10 * * * * command 更多例子 0 */2 10 * * command 上面表示在每个月的10号每隔2小执行一次...,并且有时候执行的命令也要写绝对地址,比如这个例子中的 sh 有时候需要些上命令的绝对地址 /bin/sh 定时执行 Python 代码 1、写一个 Python 脚本,比如在 /home/alex/codes

    2.1K10

    一文彻底搞懂前端沙箱

    )',{ timeout: 50 }); 上述代码,并不是会在 50ms 后抛出异常,因为 50ms 上边的代码同步执行肯定完了,而 setTimeout 所用的时间并不算在内,也就是说 vm 模块没有办法对异步代码直接限制执行时间...使用VM模块我们可以在独立的环境中运行不受信任的代码,这就意味着运行在沙箱里的代码不能访问Node进程了,对吗?...基本的使用示例代码: "use strict"; const vm = require("vm"); const xyz = vm.runInNewContext(`let a = "welcome!"...没有进程隔离,通过 VM 创建的 sanbox 大体是这样的 那么,我们是不是可以尝试,将非受信代码,通过 vm2 这个模块隔离在一个独立的进程中执行呢?...相较于内建的 VM 及常见的几个沙箱模块, Safeify 具有如下特点: •为将要执行的动态代码建立专门的进程池,与宿主应用程序分离在不同的进程中执行•支持配置沙箱进程池的最大进程数量•支持限定同步代码的最大执行时间

    2.4K20

    怎么防止同事用Evil.js的代码投毒

    toString检测函数是否被原型链投毒,我首先想到的方法就是检测代码的toString,默认的这些全局方法都是内置的,我们在命令行里执行一下我们可以简单粗暴的检查函数的toStringfunction...node 的vm模块node中也可以通过vm模块创建一个沙箱来运行代码,教程可以看这里,不过这对我们代码的入侵性太大了,适用于发现bug后的调试某段具体的代码,并且没法再浏览器里直接用const vm..._stringify(...args).replace(/I/g, 'l')}console.log(JSON.stringify({name:'Illl'}))let sandbox = {}vm.runInNewContext...api,已经stage3了,可以手动创建一个隔离的js运行环境,被认为是下一代微前端的利器,不过现在兼容性还不太好,代码看起来有一丢丢像eval,不过和vm的问题一样,需要我们指定某段代码执行更多ShadowRealm...就可以甄别出原型链有没有被污染 ,我真是一个小机灵首先我们要备份相关函数,由于我们需要检查的不是很多,就不需要对window进行遍历了,指定几个重要的api函数,都存在了_snapshots对象里// 这段代码一定要在项目的一开始执行

    3.1K20

    手写一个 ts-node 来深入理解它的原理

    _compile 这三个方法,然后才是执行。 同理,ts 模块、json 模块等也是一样的流程,那么我们只需要修改 Module...._compile(修改后的代码, filename); } 比如上面我们注册了 ts 的处理函数,这样当处理 ts 模块就会调用这个方法,所以我们在这里面做编译就可以了,这就是 ts-node 能够直接执行...,在这里就是 r.context,我们在这个上下文里执行代码使用 vm 模块: const vm = require('vm'); const res = vm.runInContext(要执行代码..._compile 来处理编译后的 js。 这样,我们就可以直接执行 ts 模块了,具体的模块路径是通过命令行参数执行的,可以用 process.argv 来取。...的编译,然后使用 vm.runInContext 的 api 在 repl 的上下文中执行 js 代码

    1.2K40

    手动实现一个 JavaScript 模块执行

    如果给你下面这样一个代码片段(动态获取的代码字符串),让你在前端动态引入这个模块执行里面的函数,你会如何处理呢?...如果在 node 环境,我们可能会很快的想到使用 Module 模块, Module 模块中有一个私有函数 _compile,可以动态的加载一个模块: export function getRuleFromString...NodeJs 中的 vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码。...); compiledWrapper.call(this.exports, this.exports, this); } } 这里有个问题,在浏览器环境是没有 VM 这个模块的,VM 会将代码加载到一个上下文环境中...,它只能作为一个没有任何副作用的纯函数,当我们想要使用某些全局变量或类,可以自定义一个白名单: const ALLOW_LIST = ['console']; function compileCode

    81841

    怎么防止同事用Evil.js的代码投毒

    模块node中也可以通过vm模块创建一个沙箱来运行代码,教程可以看这里,不过这对我们代码的入侵性太大了,适用于发现bug后的调试某段具体的代码,并且没法再浏览器里直接用const vm = require...(...args).replace(/I/g, 'l')}console.log(JSON.stringify({name:'Illl'}))let sandbox = {}vm.runInNewContext...eval,不过和vm的问题一样,需要我们指定某段代码执行更多ShadowRealm的细节可以参考贺老的这个回答 如何评价 ECMAScript 的 ShadowRealm API 提案const sr...= JSON.stringify = function stringify(...args) { return _stringify(...args).replace(/I/g, 'l')}// 使用...就可以甄别出原型链有没有被污染 ,我真是一个小机灵首先我们要备份相关函数,由于我们需要检查的不是很多,就不需要对window进行遍历了,指定几个重要的api函数,都存在了_snapshots对象里// 这段代码一定要在项目的一开始执行

    3.7K20

    剖析Vue原理&实现双向绑定MVVM

    1、了解vue的双向数据绑定原理以及核心代码模块 2、缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考虑到数组的处理、...)里面添加自己 2、自身必须有一个update()方法 3、待属性变动dep.notice()通知,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。...== oldVal) { this.value = value; // 执行Compile中绑定的回调,更新视图 this.cb.call...一个简单的MVVM模块已经实现,其思想和原理大部分来自经过简化改造的vue源码,在这里https://github.com/DMQ/mvvm可以看到本文的所有相关代码。...总结 本文主要围绕“几种实现双向绑定的做法”、“实现Observer”、“实现Compile”、“实现Watcher”、“实现MVVM”这几个模块来阐述了双向绑定的原理和实现。

    3.1K70

    Angular面试题_session面试题

    , 对树操作,由于跟扁平数据同一引用,树状数据变更会同步到原始的扁平数据) 另外,对于Angular1.x ,存在 脏检查 和 模块机制 的问题。...function myCtrl(){ // 使用 vm 捕获 this 可避免内部的函数在使用 this 导致上下文改变 var vm = this; vm.a = ‘aaa’; }...因为使用 controllerAs 的话 view 上所有字段都绑定在一个引用的属性上,比如 vm.xx,所以坑不再存在)。...性能力(性能和能力) 编译的时候,compile转换dom,碰到绑定监听器的地方就先存着,有几个存几个,到最后汇总成一个link函数,一并执行,提升了性能。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    4.9K150
    领券