我创建了一个简单的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);
无效
答案 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;