简而言之,我想对AJAX传递的功能进行“重新水化”,如下所示:
//AJAX response:
{"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"}
显然,baz
应该是一个函数而不是字符串。我该怎么办?
答案 0 :(得分:2)
如Jozef所建议,您可以使用eval()
。
但是,如果您通过Google查看,则不建议使用该功能:
正如该博客所建议的(http://2ality.com/2014/01/eval.html),我建议您使用此方法:
let json = {"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"};
let func = new Function("console.log('I am back working as a function!');");
func();
如果您无法更改json,则只需使用str.replace()
。
请记住,可以执行任意代码! 我会强烈建议您这样做某事这样,而不是仅仅用一个函数来响应。通过执行以下操作,您将进行某种白名单。因此,无论http响应是否被操纵,攻击者都只能执行预定义的javascript函数。
function func1() {
console.log('I am back working as a function!');
}
function func2() {
console.log('another code block');
}
let json = {"foo":"bar","baz":"1"};
switch(json.baz) {
case "1": func1();break;
case "2": func2();break;
default: console.error("Invalid response");
}
我希望这会有所帮助。
答案 1 :(得分:1)
有可能,但是我们当然必须使用 evil eval ..使用,后果自负!
var ajaxResponse = {"foo":"bar","baz":"function(){console.log('I am back working as a function!')}", "lambda": "() => console.log('Hello i\\'m a lambda')"};
function isAFunction(v) {
try {
eval("var f = " + v);
return typeof f === "function";
} catch (e) {
return false;
}
}
var result = Object.entries(ajaxResponse).reduce((obj, [key,value]) => {
if (isAFunction(value)) {
eval("obj[key] = " + value);
} else {
obj[key] = value;
}
return obj;
}, {});
result.baz();
result.lambda();