为什么浏览器执行内容类型 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 并为我建立了时间表。)
一些网络服务器在 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 并为我建立了时间表。)