代码之家  ›  专栏  ›  技术社区  ›  Junior Mayhé

理解启用AJAX的WCF服务生成的Json结构

  •  1
  • Junior Mayhé  · 技术社区  · 14 年前

    下午好

    支持AJAX的WCF服务 . 这将添加一个新的.svc文件。

    稍后,我创建了一个仅用于调试的方法:

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class DataAccessService
    {
        [WebGet]
        [OperationContract]
        public MyClass DoWork()
        {
            var o = new MyClass
            {
                Id = 1,
                FirstName = "Junior",
                LastName = "Mayhe"
            }; 
            return o;
        }
    }
    

    在这里进行调试时,将生成Json字符串:

    {"d":
        {"__type":"MyClass:#MyProject",
        "Id":1,
        "FirstName":"Junior",
        "LastName":"Mayhe"
        }
    }
    

    问题是,这是什么 "d" 是Json字符串的结果类型代码吗?如果是,还有其他代码吗?

    提前谢谢

    2 回复  |  直到 14 年前
        1
  •  1
  •   Eugene Osovetsky    14 年前

    它只是“d”,旨在防止某些跨站点脚本攻击。

    E、 考虑一种返回敏感数据(如银行账户余额)的int数组的方法。它可以返回为:

    [10000,12300,15000]
    

    或:

    {"d":[10000,12300,15000]}
    

    问题是,在第一种情况下,存在一种(非常高级、晦涩但仍然真实的)攻击,另一个站点可以通过在标记中包含对服务的调用并重写JavaScript数组构造函数来窃取这些数据。如果JSON看起来像后一种情况,则攻击是不可能的。

        2
  •  0
  •   Cᴏʀʏ bcherry    14 年前

    您的响应只是被一个名为“d”的父对象封装起来。它被引入到ASP.NET 3.5web服务中,作为防止JSON劫持的安全增强。

    为您的服务生成的客户端代理将去掉“d”,这样您就永远不会真正知道它在那里。但是,由于您的服务实际上不会被用于除AJAX请求之外的任何东西,因此您必须通过“.d”属性访问JSON对象。我建议使用 JSON2 要解析响应,因为在编写本文时并非所有浏览器都支持本地JSON。

    你可以多读一点关于安全问题的书 here