代码之家  ›  专栏  ›  技术社区  ›  Steve Reed Sr

JSON ASMX和那个讨厌的D:

  •  6
  • Steve Reed Sr  · 技术社区  · 14 年前

    我浏览了许多帖子,但没有成功地确定如何在来自我的ASMX Web服务的响应中摆脱烦人的D,如“d”:“response”:“ok”,“auth key”:“jkpyzfzu”。

    这是由我的类“public dictionary userdevice”通过返回dictionary对象创建的。

    如果这该死的东西不把它全部放进D物体里,我会非常高兴的!

    2 回复  |  直到 8 年前
        1
  •  1
  •   gillyb    14 年前

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

    我知道微软的JSON序列化程序在服务器端添加了D,而反序列化JSON字符串的客户端Ajax代码期望它在那里。
    我认为jquery也是这样工作的。

    你可以在阅读更多关于这个的信息 Rick Strahl's blog

    还有一种方法可以返回纯JSON(不带“d”元素),使用 WCF "Raw" programming model.

        2
  •  8
  •   Radu    8 年前

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

    你可以读到更多关于它为什么会出现在 post by Dave Ward . ( 编辑 :正如@user1334007所指出的,chrome现在将此站点标记为不安全)

    戴夫·里德对这篇文章的评论特别说明:

    它是一个非常容易 误解目的。保护措施不是针对 在示例中意外执行警报。虽然那是一个 _d__的好处是,在评估时,您仍然需要担心这一点。 将其转换为对象的JSON。

    它所做的是防止JSON响应被批发。 由于XSS攻击而执行。在这种攻击中, 攻击者可以插入调用JSON WebService的脚本元素, 即使是另一个域中的一个,因为脚本标记支持这一点。而且, 因为它毕竟是一个脚本标记,如果响应看起来像 它将作为javascript执行。同样的XSS攻击可以 重载对象或数组构造函数(以及其他可能性) 从而可以从另一个域访问JSON数据。

    要成功实现这一点,您需要(1)一个XSS易受攻击的站点 (good.com)_ GET请求(例如bank.com/getaccounts)上所需的有效负载,(3)一个 将从中捕获的数据发送到的邪恶位置(evil.com) 当人们访问good.com时,bank.com,(4)一个不幸的访问者 很好,刚刚登录到bank.com 浏览器会话。

    保护JSON服务不返回有效的javascript只是 你可以做一件事来防止这种情况。不允许GET是另一个 (脚本标记总是得到)。需要特定的HTTP头是 另一个(脚本标记可以设置自定义头或值)。这个 ASP.NET Ajax中的WebService堆栈可以完成所有这些工作。任何人创造 他们自己的堆栈也应该小心这样做。