为什么浏览器执行内容类型 json 的 <script>?

Why do browsers execute <script> with content-type json?

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

这是为了防止JSON hijacking:

This is to ensure some other site can't do nasty tricks to try to steal your data. For example, by replacing the array constructor, then including this JSON URL via a tag, a malicious third-party site could steal the data from the JSON response. By putting a while(1); at the start, the script will hang instead. @bdonlan,

但是,'misuse' 的 JSON 内容作为 <script> 来源是唯一可能的,因为网络浏览器(例如 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?

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

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

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

由于 Web 基础设施的第一条规则是“不要破坏 Web”,因此没有人愿意更改脚本的安全模型,因此也没有其他变通方法必须到位。

换句话说——有人在那里作为 JSONP 定期服务 JSON,如果浏览器拒绝执行它,世界会认为浏览器坏了——而不是网络服务器。

(感谢 Quentin 的参考 link 并为我建立了时间表。)