我使用eval来解释一些变量输入。
可能的输入是
"somevar"
"someobj.someprop['somekey'].someprop"
"window.someprop"
等
但是我不希望它'执行' 任何操作。就像调用任何函数一样,更改任何值的任何值,声明任何变量。
所以不应该接受这些(以及任何改变任何状态的东西):
alert()
var somewar = 0
mywar = somewar
是否可以通过原生js?
我的目标只是解释复杂的输入变量"地址"并将其归还。
答案 0 :(得分:3)
对于这样的事情,你可能更好地解析价值。
var steps = input.match(/\['(?:[^']|\\.)+'\]|\["(?:[^"]|\\.)+"\]|[a-zA-Z0-9_]+/g);
var src = window;
var step;
while(step = steps.shift()) {
if( step.charAt(0)) {
// ['...'] or ["..."]
step = step.substring(2,step.length-2);
}
src = src[step];
}
alert(src);
由于您正在解析字符串,因此无法执行恶意代码。