我查看过很多帖子并且没有成功地确定如何摆脱来自我的asmx网络服务的响应中的麻烦,如{“d”:{“响应”:“确定” , “验证密钥”: “JKPYZFZU”}}
这是由我的类'public Dictionary UserDevice'通过返回Dictionary对象创建的。
如果该死的东西不能全部放入d物体,我会非常高兴!
答案 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也是这样的。
有一种方法可以使用WCF "Raw" programming model.
返回纯json(没有'd'元素)