我查看过很多帖子并且没有成功地确定如何摆脱来自我的asmx网络服务的响应中的麻烦,如{"d":{"Response":"OK","Auth -Key ":" JKPYZFZU"}}.
这是由我的类'public Dictionary UserDevice'通过返回Dictionary对象创建的.
如果该死的东西不能全部放入d物体,我会非常高兴!
基本上JSON数组表示法['hello']
本身就是有效的JavaScript,而JSON对象表示法{'d': ['hello'] }
本身并不是有效的JavaScript.这具有阵列符号可执行的结果,这开启了XSS攻击的可能性.默认情况下将数据包装在对象中有助于防止这种情况发生.
你可以阅读更多关于它的原因 由戴夫沃德发布.(编辑:正如@ user1334007所指出的,Chrome会将此网站标记为不安全)
Dave Reed对该文章的评论特别告知:
这是一个非常容易误解的安全功能之一.在您的示例中,保护并不是真的反对意外执行警报.虽然这是'd'的一个好处,但在评估JSON以将其转换为对象时,您仍然需要担心这一点.
它所做的是防止JSON响应因XSS攻击而被批量执行.在这种攻击中,攻击者可以插入一个调用JSON Web服务的脚本元素,甚至是一个不同域的脚本元素,因为脚本标记支持它.并且,因为它是一个脚本标签,如果响应看起来像javascript它将作为javascript执行.相同的XSS攻击可以重载对象或数组构造函数(以及其他可能性),从而可以从其他域访问该JSON数据.
要成功实现这一目标,您需要(1)xss易受攻击的站点(good.com) - 任何站点都可以,(2)JSON Web服务,在GET请求上返回所需的有效负载(例如bank.com/getaccounts), (3)一个邪恶的位置(evil.com),当人们访问good.com时,向您发送从bank.com捕获的数据,(4)刚好碰巧登录bank.com的一个不幸访问good.com的访问者使用相同的浏览器会话.
保护您的JSON服务不返回有效的javascript只是您可以做的一件事来防止这种情况.不允许GET是另一个(脚本标签总是做GET).需要某个HTTP标头是另一个(脚本标签不能设置自定义标头或值).ASP.NET AJAX中的Web服务堆栈完成了所有这些工作.任何创建自己的堆栈的人都应该小心谨慎.