2011-01-31 91 views
6

在那里?在json对象内执行javascript代码?

所以像:

{ key1 : "val1", key2: "val2", some_code: "document.getElementById("someid").innerHTML='test';" } 

所以some_code将无需用户干预执行?

+0

如下所示,是的,你可以。但是,最好避免。如果您向第三方提供此应该被阻止。 – 2011-01-31 10:44:28

回答

2

这是可以做到的,是的,例如,通过这样做:

{ 
    "functionName": function() { 
    alert('Hello!'); 
    }() 
} 

但是,这不会是有效的JSON了。 JSON不接受函数。

+0

嗯 - 有点难以构建,并将该结构从后端服务器传递到客户端浏览器? – 2011-01-31 13:08:24

3

这不会是JSON了。但你可以后处理解析的JSON:

json.some_code = eval(json.some_code); 

但是这可能是危险的(脚本注入等)。

所以,如果你可以做到这一点,而不是:

json = { key1 : "val1", key2: "val2", elem: "someid", html:"test" }; 
document.getElementById(json.elem).innerHTML=json.html; 
0

哦,首先你需要转义双引号:(或者使用单引号)

{ key1 : "val1", key2: "val2", some_code: "document.getElementById(\"someid\").innerHTML='test';" } 

如果您想将some_code字段评估为脚本,就如同将它传递给评估一样简单:

eval(obj.some_code); 

这当然是非常危险的,除非您对some_code的内容有绝对的控制权。

2

首先,您的示例不是有效的JSON。试试JSON validator

其次,JSON是一种数据交换标准,当正确解析时,任何内部的代码都不会被执行。

阅读JSON security issues

经验法则:不要使用JavaScript eval函数,而要使用现成的解析器,如Douglas Crockford的JSON evaluator

+0

好的,谢谢你们 - 我认为id probaly坚持 - json作为数据,并且没有可能的方式来“自我执行”json对象。 – 2011-01-31 13:21:15