Zac*_*ott 97 json anonymous-function
网站的JSON响应的一部分有这个(...为上下文添加):
{..., now:function(){return(new Date).getTime()}, ...}
Run Code Online (Sandbox Code Playgroud)
向JSON添加匿名函数是否有效?我希望每次你访问"时间"返回一个不同的值.
Mik*_*ike 102
没有.
JSON纯粹是一种数据描述语言.如http://www.json.org所述,它是一种"轻量级数据交换格式". - 不是编程语言.
根据http://en.wikipedia.org/wiki/JSON,支持的"基本类型"是:
nullhar*_*are 16
问题是JSON作为数据定义语言是从JSON演变为JavaScript Object Notation.由于Javascript支持在JSON上使用eval,因此将JSON代码放在JSON中是合法的(在该用例中).如果您使用JSON远程传递数据,那么我会说将方法放在JSON中是不好的做法,因为您可能没有很好地建模您的客户端 - 服务器交互.而且,当我希望使用JSON作为数据描述语言时,我会说你可能会因为嵌入方法而陷入麻烦,因为一些JSON解析器只是考虑了数据描述,并且可能不支持结构中的方法定义.
维基百科JSON条目为不包括JSON中的方法提供了一个很好的理由,引用了安全性问题:
除非您完全信任文本的来源,并且您需要解析和接受不严格遵循JSON的文本,否则应该避免使用eval()并使用JSON.parse()或其他JSON特定的解析器.JSON解析器将仅识别JSON文本,并将拒绝其他可能包含恶意JavaScript的文本.在提供本机JSON支持的浏览器中,JSON解析器也比eval快得多.预计本机JSON支持将包含在下一个ECMAScript标准中.
让我们引用其中一个规范 - http://tools.ietf.org/html/rfc7159#section-12
所述的JavaScript对象符号(JSON)数据交换格式规范规定:
JSON是JavaScript的子集,但不包括赋值和调用.
由于JSON的语法是从JavaScript借用的,因此可以使用该语言的"eval()"函数来解析JSON文本.这通常构成不可接受的安全风险,因为文本
可能包含可执行代码以及数据声明.同样的考虑适用于在任何其他编程语言中使用类似eval()的函数,其中JSON文本符合该
语言的语法.
因此,所有声明的功能都不属于JSON标准的答案都是正确的.
官方答案是:不,在JSON结果中定义函数是无效的!
答案可能是肯定的,因为"代码是数据","数据是代码".即使将JSON用作与语言无关的数据序列化格式,也可以通过其他类型对"代码"进行隧道传输.
可以使用JSON字符串将JS函数传递给客户端浏览器以供执行.
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
Run Code Online (Sandbox Code Playgroud)
这引出了一个问题:如何" 执行存储为字符串的JavaScript代码 ".
做好准备,提高你的"eval()是邪恶的"旗帜并坚持你的"不通过JSON隧道功能"标志旁边.
不,绝对不是。
如果你使用一个像样的 JSON 序列化器,它不会让你序列化这样的函数。它是有效的 OBJECT,但不是有效的 JSON。无论该网站的意图是什么,它都不会发送有效的 JSON。
| 归档时间: |
|
| 查看次数: |
92508 次 |
| 最近记录: |