JSON serializing an object with function parameter

后端 未结 3 1565
失恋的感觉
失恋的感觉 2021-01-01 22:46

I have this C# object:

var obj = new {
    username = \"andrey\",
    callback = \"function(self) { return function() {self.doSomething()} (this) }\"
}
         


        
3条回答
  •  借酒劲吻你
    2021-01-01 23:29

    This behavior is deliberate. JSON should not include anything that is not data -- in your case an executable function. The browser will be opening up to huge security risks if data can come back from a server in JSON format that, when executed, will run arbitrary functions (that can steal info, redirect the user to a malicious site etc.)

    Early implementations of JSON rely on the fact that data returned back can be simply executed via eval() to get back an object. However, people almost immediately realized that this opens up huge security risks and have been trying to handle it since. That's why, before the standardized JSON object, people stopped putting raw JSON data into eval() and used JSON parsing libraries instead.

    The JSON object will always serialize an object into data only. This is by design. THe standardized JSON format has no way to represent an executable function.

    Now, you can easily convert that callback on a browser into a function by passing it through to eval(). However, don't do it. You're just opening yourself up for hacking.

    On the server side, modern browsers are designed to prevent this exact thing from happening -- i.e. data being sent from a browser that contains an executable function.

提交回复
热议问题