小编典典

JSON使用功能参数序列化对象

ajax

我有这个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”参数不是函数而是字符串。任何想法如何解决它,最好是在服务器端?


阅读 502

收藏
2020-07-26

共1个答案

小编典典

此行为是故意的。JSON不应包含任何非数据的内容-
在您的情况下为可执行函数。如果数据能够以JSON格式从服务器返回,则该浏览器将面临巨大的安全风险,该JSON格式在执行时将运行任意功能(可以窃取信息,将用户重定向到恶意站点等)。

JSON的早期实现依赖这样一个事实,即返回的数据可以简单地通过eval()执行以获取对象。但是,人们几乎 立即
意识到这带来了巨大的安全风险,并且此后一直在设法加以解决。这就是为什么在标准化JSON对象之前,人们停止将原始JSON数据放入eval()并使用JSON解析库的原因。

JSON对象将始终仅将对象序列化为数据。这是设计使然。标准化JSON格式无法表示可执行函数。

现在,您可以通过将回调传递给eval()轻松地将其在浏览器上转换为函数。但是, 请不要这样做 。您只是在为黑客开放自己。

在服务器端,现代浏览器旨在防止发生这种确切的事情,即从包含可执行功能的浏览器发送数据。

2020-07-26