在JSON安全中使用高级构造(函数,新函数调用)吗?
问题描述:
JSON是将我的服务器端代码中的复杂数据传递给客户端JavaScript的好方法。例如,在PHP我可以写:在JSON安全中使用高级构造(函数,新函数调用)吗?
<script type="text/javascript>
var MyComplexVariable = <?= BigFancyObjectGraph.GetJSON() ?>;
DoMagic(MyComplexVariable);
</script>
这是很酷,但有时你想传递超过基础数据,如日期,甚至函数的定义。还有一个简单直接的方法,比如:
<script type="text/javascript>
var MyComplexVariable = {
'SimpleProperty' : 42,
'FunctionProperty' : function()
{
return 6*7;
},
'DateProperty' : new Date(989539200000),
'ArbitraryProperty' : GetTheMeaningOfLifeUniverseAndEverything()
};
DoMagic(MyComplexVariable);
</script>
而且这个功能在我目前为止所见过的所有浏览器中都很有用。但根据JSON.org这样的语法是无效的。另一方面,我已经看到这个语法在很多地方被使用,包括一些流行的JavaScript框架。所以......
我可以想到的任何问题,如果我用“不支持” JSON的功能,比如上面?为什么它是错的?
新增澄清:如果我希望我的JSON由一些不知名的第三方软件被消耗掉,甚至已知解析器不是一个浏览器,那么这样的外来确实将很有可能无法正常工作,我不会试图嵌入它们。但是我对JSON代码直接写入由Internet浏览器执行的JavaScript代码块中的情况感兴趣。就像上面的例子。
答
根据JSON.org,一个JSON对象只支持对象的下列值成员:
alt text http://json.org/value.gif
因为这些都不是一个功能,我建议不使用它,因为,正如你说,这是不是在规范正式支持。
此外,当非JavaScript客户端(如Python程序)尝试消耗你的JSON会发生什么?它如何运行你的JavaScript代码?
如果我用它只是数据,其中目标解析器将最有可能不能是浏览器,那么我会同意你的看法。但是我问在哪里,我在我的JavaScript客户端代码直接嵌入JavaScript的场景。它将由浏览器执行。 – 2010-04-19 13:17:45