gpt4 book ai didi

JavaScript 内部工作原理解释

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:46 25 4
gpt4 key购买 nike

我正在努力理解这段 JavaScript 的内部工作原理。

var vm = require('vm');
const util = require('util')


payload1 = "this.ref.constructor.constructor('return console')().log('Testing 1')";
payload2 = "this.constructor.constructor('return console')().log('Testing 2')";

context = { ref: {} };
try {
result1 = vm.runInNewContext(payload1, context);
result2 = vm.runInNewContext(payload2, context);
}
catch(e) {
console.log("Error");
console.log(e);
}

在 NodeJS v0.10.29 上,有效负载 1 执行,有效负载 2 不执行。错误提示控制台未定义。我大致了解为什么会出现这种情况,因为 future 版本的 Node 中的 vm 模块发生了变化,但我不明白这两个有效负载有什么不同。

对我来说,两个有效负载都访问一个对象构造函数,它是一个函数,然后访问函数构造函数,它允许您使用各种参数构建一个函数。在这种情况下,该函数将返回控制台实例,我们执行该实例,然后访问控制台的日志函数。为什么其中一个有效负载可以返回控制台对象,而另一个则不能?

如果它们在 v0.10.29 中都失败了,然后在未来的版本中都可以工作,那对我来说是有意义的,但事实并非如此。同样,我对两个有效负载之间的差异更感兴趣,而不是与 vm 模块的交互。该脚本只是一个练习。

感谢大家的帮助

最佳答案

两个代码段都访问 native Function 构造函数。不同之处在于 payload1 在从外部传递到虚拟机的 ref 对象上访问它,并且是调用代码的全局 Function 内置函数 - 当然也有可用的全局 console 。相比之下,payload2 在 vm 环境内的全局 this 值上访问它,并获取 vm 环境的 Function 构造函数 - 它也会评估 vm 范围内的 return console 代码,其中未定义 console

为了简化,您应该能够获得类似的结果

demo = { log(x) { console.log(x + " from outer"); } };
payload1 = "f('return demo')().log('Testing 1')";
payload2 = "Function('return demo')().log('Testing 2')";
context = { f: Function, demo: { log(x) { console.log(x + " from inner"); }}};

关于JavaScript 内部工作原理解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60105395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com