Vm2: TypeError:代理上的“获取”:属性“常量”是代理目标上的只读且不可配置的数据属性,但代理未返回其实际值

创建于 2017-03-07  ·  15评论  ·  资料来源: patriksimek/vm2

在尝试在vm中要求依赖时注意到了这一点。 重现一些代码:

const { NodeVM } = require("vm2");

const vm = new NodeVM({
  console: "redirect",
  sandbox: {},
  require: {
    builtin: ["fs"]
  },
  wrapper: "none"
});

vm.run("const fs = require('fs'); fs.constants");

完整堆栈跟踪:

node_modules/vm2/lib/main.js:327
            throw this._internal.Decontextify.value(e);
            ^
TypeError: 'get' on proxy: property 'constants' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
    at Object.<anonymous> (vm.js:1:91)
    at NodeVM.run (node_modules/vm2/lib/main.js:325:27)
    at Object.<anonymous> (script.js:12:4)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)

让我知道是否还有其他可以给您提供帮助的信息!

bug confirmed help wanted

最有用的评论

在用于运行的脚本中导出ES6 _class_时遇到此错误。 我把它翻译成
ES5。

所有15条评论

我也有很多关于代理的问题,特别是关于继承的问题。 我不确定这些问题是否是由于Proxies的实现或限制引起的,但是值得进行一些研究。

也碰到了这个错误。 我对代理服务器并不熟悉,无法理解为什么当前模式不正确,但是我可以通过在Contextify.object.get为只读的不可配置属性添加额外的检查来使错误消失:

    object: function(object, traps, deepTraps, flags, mock) {
        const proxy = new host.Proxy(object, host.Object.assign({
            get: (target, key, receiver) => {
                if (key === 'vmProxyTarget' && DEBUG) return object;
                if (key === 'isVMProxy') return true;
                if (mock && key in mock) return mock[key];
                if (key === 'constructor') return Object;
                if (key === '__proto__') return Object.prototype;

                                // Added code
                const config = host.Object.getOwnPropertyDescriptor(object, key);
                if (config && config.configurable === false && config.writable === false) {
                    return object[key];
                }

这似乎遵循get不变MDN的描述

如果目标对象属性是不可写,不可配置的数据属性,则为属性报告的值必须与相应目标对象属性的值相同。

但在我看来,它会打破沙盒

请注意,我们也在本地遇到了此问题,上述代码更改使我们可以绕过该问题。 还请注意,这是在他们的快速入门指南(https://developers.google.com/sheets/api/quickstart/nodejs)的几乎完全相同的副本中使用Google表格节点模块时发生的。

关于此问题是否有任何更新?

此修补程序是否会影响已知的问题“无法定义扩展代理类的类?” 您是什么意思,它将破坏沙盒?

嘿,在这个问题上有什么进展吗?
我尝试使用graceful-fs并遇到相同的错误。

在用于运行的脚本中导出ES6 _class_时遇到此错误。 我把它翻译成
ES5。

不幸的是, @ mjbvz发布的解决方案打破了沙箱。 我认为没有办法解决此问题-只读对象的代理只能返回原始值,而不能返回其他任何内容,否则我们就被搞砸了,抛出错误是确保沙盒安全的唯一方法。

想法很受欢迎。

在这种情况下可以克隆吗?

克隆无济于事-克隆也是一个独特的价值。

我的意思是fs.constants的克隆,因此它不再是只读的。

这将允许沙箱对对象进行更改,从而可能导致主机范围内的问题。 您需要非常小心要发送到沙箱的内容,因为沙箱对对象所做的每项更改在主机上下文中也是有效的。

如果它是只读的,您是否甚至需要代理来验证内容?

关于此问题是否有任何更新?
使用googleapi节点模块时出现相同问题...

@XmiliaH谢谢! 非常感谢。 它正在使用最新版本。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

unxcepted picture unxcepted  ·  11评论

wojpawlik picture wojpawlik  ·  4评论

patriksimek picture patriksimek  ·  15评论

somebody1234 picture somebody1234  ·  4评论

vshymanskyy picture vshymanskyy  ·  8评论