通过AJAX传递带有函数的JSON

时间:2018-09-29 19:59:40

标签: javascript json ajax

简而言之,我想对AJAX传递的功能进行“重新水化”,如下所示:

//AJAX response:
{"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"}

显然,baz应该是一个函数而不是字符串。我该怎么办?

2 个答案:

答案 0 :(得分:2)

如Jozef所建议,您可以使用eval()

但是,如果您通过Google查看,则不建议使用该功能:

  1. https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
  2. When is JavaScript's eval() not evil?
  3. https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
  4. Why is using the JavaScript eval function a bad idea?

正如该博客所建议的(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();

相关问题