Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS解释器-更改“;这”;上下文_Javascript_Interpreter - Fatal编程技术网

Javascript JS解释器-更改“;这”;上下文

Javascript JS解释器-更改“;这”;上下文,javascript,interpreter,Javascript,Interpreter,是一个有点知名的JavaScript解释器。它的安全优势在于它可以将您的代码与文档完全隔离,并允许您检测无限循环和内存炸弹等攻击。这允许您安全地运行外部定义的代码 我有一个对象,比如说o: let o = { hidden: null, regex: null, process: [ "this.hidden = !this.visible;", "this.regex = new RegExp(this.validate, 'i');"

是一个有点知名的JavaScript解释器。它的安全优势在于它可以将您的代码与
文档
完全隔离,并允许您检测无限循环和内存炸弹等攻击。这允许您安全地运行外部定义的代码

我有一个对象,比如说
o

let o = {
    hidden: null,
    regex: null,
    process: [
        "this.hidden = !this.visible;",
        "this.regex = new RegExp(this.validate, 'i');"
    ],
    visible: true,
    validate: "^[a-z]+$"
};
我希望能够通过JS解释器在
过程中运行代码:

for (let i = 0; i < o.process.length; i++)
    interpretWithinContext(o, o.process[i]);
也就是说,
hidden
regex
现在已设置


有人知道这在JS解释器中是否可行吗?

没有尝试过
JS解释器。您可以使用
newfunction()
Function.prototype.call()
来实现需求

设o={
隐藏:null,
regex:null,
过程:[
“this.hidden=!this.visible;”,
this.regex=new RegExp(this.validate,'i')
],
可见:对,
验证:“^[a-z]+$”
};
for(设i=0;ilog(新函数(`return${o.process[i]}`)调用(o))Hi可能在文本中被解释为类似这样的内容

let interpretWithinContext = (function(o, p){
   //in dunno for what you use p because all is on object o
   o.hidden = (o.hidden === null) ? false : o.hidden;
   o.regex = (o.regex === null) ? '/^[a-z]+$/i' : o.regex;

   console.log(o);
   return o;
});

我现在花了一段时间摆弄JS解释器,试图弄清楚如何将一个对象放入解释器的作用域中,该对象既可以读取也可以修改

不幸的是,按照这个库的构建方式,所有有用的内部内容都被缩小了,因此我们无法真正利用内部内容,而只是将一个对象放入其中。添加对象的尝试也失败,因为该对象没有以“正常”方式使用

所以我最初的方法是返回到提供简单的实用函数来访问外部对象。这是完全由库支持的,并且可能是与库交互的最安全的方式。但它确实需要您更改
过程
代码,以便使用这些功能。但作为一个好处,它确实提供了一个与“外部世界”交流的非常干净的界面。您可以在以下隐藏的代码段中找到解决方案:

函数create解释器(dataObj){
函数初始化(intp,作用域){
setProperty(作用域'get',intp.createNativeFunction(函数(prop)){
返回intp.nativeToPseudo(dataObj[prop]);
}),intp.READONLY_描述符);
intp.setProperty(作用域,'set',intp.createNativeFunction(函数(属性,值){
dataObj[prop]=intp.pseudoToNative(值);
}),intp.READONLY_描述符);
}
返回函数(代码){
const解释器=新解释器(代码,初始化);
explorer.run();
返回值;
};
}
设o={
隐藏:null,
regex:null,
过程:[
“设置('隐藏',!获取('可见');”,
set('regex',new RegExp(get('validate'),'i')
],
可见:对,
验证:“^[a-z]+$”
};
常量解释器=创建解释器(o);
for(o.过程的常数过程){
口译(过程);
}
console.log(o.hidden);//假的
console.log(o.regex);///^[a-z]+$/i

在JS解释器的文档中没有名为
解释器的函数。它是如何定义的?我想定义一个函数来包装JS解释器特定的函数。谢谢你,你的代码确实可以+1工作,但我仍然在寻找使用JS解释器的解决方案,因为它提供了防止无限循环和其他“攻击”的方法。将
o
想象为从文件加载的JSON对象,然后你想在
进程中运行该文件中定义的代码,这样就不能硬编码了。@YiminRong我根本不懂这个主题;)这让我很困惑,在文本中,现在对我来说很清楚了。我不知道为什么我之前的评论被删除了,但无论如何,这是一个了不起的工作。我永远不会想到这个。积分悬而未决!我也不知道为什么这些评论被删除了,但我确实在你发布的时候看到了。正如我之前所说,这是一个有趣的挑战——所以不客气!提前感谢您的奖励,非常感谢您的手势:)如果我在
o
中添加参数,请说
array:[],
,然后尝试使用code
o.array.push(42),它会出现
未捕获类型错误:函数push(){[native code]}不是函数。它正在提取与JS解释器不兼容的本机代码。我试图修改
newGetProperty
以返回JS解释器函数,但随后它进入了另一个包含不兼容对象的兔子洞。
.length
属性可用,因此可以模拟
push
,但是
pop
和其他属性可能更难。只是提醒一下,这个上下文中的代码必须非常简单@YiminRong您可以做的是检查
newGetProperty
中的
value
是否是数组,然后为它返回一个伪数组(基本上是
if(array.isArray(value)){返回this.nativeToPseudo(value);}
)。这样,您仍然无法执行
o.array.push(42)
(当然可以,但它不会更新本机数组),但您可以执行
var x=o.array;x、 推(42);o、 数组=x–所以基本上,你不能改变数组,但你可以替换它们。谢谢你的建议。就我而言,我唯一需要的数组函数是
push
,它可以复制为
o.Array[o.Array.length]=value。只需对您的原始代码进行一些修改,我就能让它做出惊人的事情!
let interpretWithinContext = (function(o, p){
   //in dunno for what you use p because all is on object o
   o.hidden = (o.hidden === null) ? false : o.hidden;
   o.regex = (o.regex === null) ? '/^[a-z]+$/i' : o.regex;

   console.log(o);
   return o;
});