Javascript JS解释器-更改“;这”;上下文
是一个有点知名的JavaScript解释器。它的安全优势在于它可以将您的代码与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');"
文档
完全隔离,并允许您检测无限循环和内存炸弹等攻击。这允许您安全地运行外部定义的代码
我有一个对象,比如说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;i log(新函数(`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:[],
,然后尝试使用codeo.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;
});