在JSON安全中使用高级构造(函数,函数,函数调用)吗?

时间:2010-04-19 13:08:43

标签: json standards

JSON是将复杂数据从我的服务器端代码传递到客户端JavaScript的好方法。例如,在PHP中我可以写:

<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代码块的情况感兴趣。像上面的例子一样。

1 个答案:

答案 0 :(得分:2)

根据JSON.org,JSON对象仅支持对象的以下值成员:

alt text http://json.org/value.gif

由于这些都不是函数,我建议不要使用它,因为正如你所说,它在规范中没有得到官方支持。

此外,当非Javascript客户端(例如Python程序)试图使用您的JSON时会发生什么?如何运行JavaScript代码?