我有这个C#对象:
var obj = new { username = "andrey",callback = "function(self) { return function() {self.doSomething()} (this) }" }
我需要将JSON序列化到ajax调用中传递给浏览器.我使用JavascriptSerializer,但它序列化到以下JSON:
{"username":"andrey","callback": "function(self) { return function() {self.doSomething()} (this) }"}
但我需要的是:
{"username":"andrey","callback": function(self) { return function() {self.doSomething()} (this) }}
>没有引用函数定义.
现在,当JSON对象到达浏览器并被创建时,’callback’参数不是一个函数,而是一个字符串.任何想法如何解决它,最好在服务器端?
解决方法
这种行为是故意的. JSON不应该包括任何不是数据的东西 – 在你的情况下是可执行的功能.如果数据可以从JSON格式的服务器返回,浏览器将会面临巨大的安全隐患,在执行时,它将运行任意功能(可以窃取信息,将用户重定向到恶意站点等)
JSON的早期实现依赖于返回的数据可以通过eval()简单地执行以返回一个对象.但是,人们几乎立即意识到这样会带来巨大的安全隐患,并且一直在试图处理它.这就是为什么在标准JSON对象之前,人们将原始JSON数据放在eval()中,而是使用JSON解析库.
JSON对象将始终将对象序列化为数据.这是设计.标准化的JSON格式无法表示可执行的功能.
现在,您可以通过将其传递给eval(),轻松地将浏览器中的回调转换为函数.但是,不要这样做.你只是打开自己的黑客.
在服务器端,现代浏览器旨在防止这种确切的事情发生 – 即从包含可执行功能的浏览器发送的数据.