json asmx和那个讨厌的d:

时间:2010-08-05 18:41:53

标签: json.net

我查看过很多帖子并且没有成功地确定如何摆脱来自我的asmx网络服务的响应中的麻烦,如{“d”:{“响应”:“确定” , “验证密钥”: “JKPYZFZU”}}

这是由我的类'public Dictionary UserDevice'通过返回Dictionary对象创建的。

如果该死的东西不能全部放入d物体,我会非常高兴!

2 个答案:

答案 0 :(得分:8)

基本上JSON数组表示法['hello']本身就是有效的JavaScript,而JSON对象表示法{'d': ['hello'] }本身并不是有效的JavaScript。这具有阵列符号可执行的结果,这开启了XSS攻击的可能性。默认情况下将数据包装在对象中有助于防止这种情况发生。

您可以在 post by Dave Ward 中详细了解它的原因。 (修改:正如@ user1334007所指出的,Chrome会将此网站标记为不安全)

Dave Reed对该文章的评论特别说明:

  

这是一个非常容易的安全功能之一   误解的目的。保护并不是真的反对   在您的示例中意外执行警报。虽然那是一个   'd'的好处,你在评估时仍然需要担心   将它转换为对象的JSON。

     

它做的是防止JSON响应被批发   由于XSS攻击而执行。在这样的攻击中,   攻击者可以插入一个调用JSON Web服务的脚本元素,   甚至一个在不同的域上,因为脚本标签支持它。和,   因为它是一个脚本标签,如果响应看起来像   它会以javascript的形式执行。相同的XSS攻击可以   重载对象或数组构造函数(以及其他可能性)   从而可以从其他域访问该JSON数据。

     

要成功实现这一目标,您需要(1)xss易受攻击的网站   (good.com) - 任何网站都会这样做,(2)一个返回a的JSON网络服务   GET请求中所需的有效负载(例如bank.com/getaccounts),(3)a   邪恶的位置(evil.com),用于发送您从中捕获的数据   bank.com,当人们访问good.com,(4)一个不幸的访问者   刚刚碰巧使用相同的登录到bank.com的good.com   浏览器会话。

     

保护您的JSON服务不会返回有效的javascript   你可以采取一件事来防止这种情况发生。不允许GET是另一个   (脚本标签总是做GET)。需要某个HTTP头是   另一个(脚本标签不能设置自定义标头或值)。该   ASP.NET AJAX中的webservice堆栈可以完成所有这些工作。任何人创造   他们自己的堆栈应该小心做同样的事情。

答案 1 :(得分:1)

您可能正在使用某种框架来自动使用d元素包装您的Web服务json响应。

我知道微软的JSON序列化程序在服务器端添加了d,并且反序列化JSON字符串的客户端AJAX代码期望它在那里。
我认为jQuery也是这样的。

您可以在Rick Strahl's blog

了解更多相关信息

有一种方法可以使用WCF "Raw" programming model.

返回纯json(没有'd'元素)