为啥浏览器使用 content-type json 执行 <script>?

Posted

技术标签:

【中文标题】为啥浏览器使用 content-type json 执行 <script>?【英文标题】: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://***.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 执行?

【问题讨论】:

【参考方案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 提供参考链接并为我建立时间表。)

【讨论】:

以上是关于为啥浏览器使用 content-type json 执行 <script>?的主要内容,如果未能解决你的问题,请参考以下文章

浏览器对 json ajax 响应的 Content-Type 标头有啥要求?

PHP使用CURL设置header头传参以及设置Content-Type: application/json类型的后台数据接收

Content-Type 之 application/json 与 text/javascript

为啥当 URL 使用 Web 浏览器工作时,WebClient.DownloadFile 方法不起作用并显示“未找到 JSON”?

KindEditor解决浏览器兼容性的问题

FormData和Payload