什么{“d”:“”}表示在asp.net webservice响应中

时间:2011-08-29 07:44:37

标签: .net asp.net web-services

我创建了一个简单的C#asp.net Web服务函数,它返回一个字符串消息
我使用jquery ajax从页面调用它。

C#:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string HelloWorld() {
    return DateTime.Now.ToString();
}


JS:

    $(document).ready(function() {
    //alert("ready");
        $.ajax({
            type: "POST",
            contentType: "application/json; chatset=utf-8",
            url: "WebService2.asmx/HelloWorld",
            data: "{}",
            dataType: "json",
            success: function(msg) {
                //alert(msg); //doesnt works
                alert(msg.d);
            }
        });
    });

我的问题是为什么alert(msg);无效

2 个答案:

答案 0 :(得分:10)

这是一种安全加固机制。

从本质上讲,它有助于防御CSRF类型的攻击,攻击者从受害者网站读取JavaScript数组(从Json下载)。他们可以通过覆盖JavaScript的Array类型来做到这一点。 d导致返回的Json不是数组,因此对于攻击者来说,数组覆盖无效。

请参阅此博文:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

答案 1 :(得分:7)

  

ASP.NET和WCF JSON服务端点实际上将其JSON包装在一个   具有“d”属性的对象可以规避微妙的潜力   使用JSON时的安全漏洞

Phil Haack的帖子:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

这是从ASP.NET3.5引入的。如果你希望msg在3.5之前和之后的两个框架中都可以工作,那就试试这个小黑客。

var data = msg.hasOwnProperty("d") ? msg.d : msg;

礼貌戴夫沃德:Never worry about ASP.NET AJAX’s .d again