【问题标题】:Why do browsers execute <script> with content-type json?为什么浏览器使用 content-type json 执行 <script>?
【发布时间】:2016-10-18 05:12:09
【问题描述】:

一些网络服务器在 JSON 响应前添加 while(1);,例如。 G。 while(1);['id',123]

这是为了防止JSON hijacking:

这是为了确保其他一些网站不会做出令人讨厌的伎俩来尝试 窃取您的数据。例如,通过替换数组构造函数,则 通过标记包含此 JSON URL,恶意第三方 站点可以从 JSON 响应中窃取数据。通过放一个 而(1);一开始,脚本将挂起。 @bdonlan,https://stackoverflow.com/a/871508/1647737

但是,这种将 JSON 内容“误用”为 &lt;script&gt; 源的情况只有在网络浏览器(例如 Firefox)执行内容类型为 application/json 的脚本时才有可能:

<!-- Content-type: application/json; charset=ISO-8859-1 -->
<script src="http://code.jsontest.com/?mine=1"></script>

浏览器不能简单地忽略内容类型不匹配的远程脚本吗?例如。在上面的示例中,script type 将是 application/javascript(默认情况下),但响应的内容类型为 application/json。为什么它仍然作为 JavaScript 执行?

【问题讨论】:

    标签: javascript json security content-type


    【解决方案1】:

    浏览器往往对content-type 非常宽容。 JavaScript 刚出现时,还没有标准化的 content-type

    这样做的结果是,许多较旧的 Web 服务器发送具有各种内容类型的 JavaScript,而浏览器几乎可以接受任何内容。如果浏览器请求了 JavaScript,它会假定它得到了 JavaScript 并执行了它。

    (甚至可以将 JavaScript 隐藏在 GIF 中并让它执行。引用一次:http://iamajin.blogspot.com/2014/11/when-gifs-serve-javascript.html

    由于网络基础设施的第一条规则是“不要破坏网络”,没有人愿意更改脚本的安全模型,因此必须采取其他变通办法.

    换句话说 - 有人将常规 JSON 作为 JSONP 提供服务,如果浏览器拒绝执行它,世界会认为浏览器已损坏 - 而不是 Web 服务器。

    (感谢 Quentin 提供参考链接并为我建立时间表。)

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2012-10-30
      • 2019-06-28
      • 2020-04-23
      • 2020-10-11
      • 2018-02-28
      • 1970-01-01
      • 2011-09-10
      • 2014-09-01
      相关资源
      最近更新 更多