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

时间:2016-06-16 15:24:37

标签: javascript json security content-type

某些网络服务器使用添加JSON响应,而(1); ,e。 G。 <代码>而(1); [ 'ID',123]

&#xA;&#xA;

这是为了防止 JSON劫持

&#xA;&#xA;
&#xA;

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

&#xA;
&#xA;&#xA;

然而,这种“误用”JSON内容作为&lt; script&gt; 源是唯一可能的,因为webbrowsers(例如Firefox)执行内容类型的脚本 application / json

&#xA;&#xA;

&#xD;&#xA;
&#xD;&#xA;
 &lt;! -  Content-type:application / json; charset = ISO-8859-1  - &gt;&#xD;&#xA;&lt; script src =“http://code.jsontest.com/?mine=1”&gt;&lt; / script&gt;  
&#的xD;&#XA;
&#的xD;&#XA;
&#的xD;&#XA;

&#XA;&#XA; < p>浏览器不能简单地忽略内容类型不匹配的远程脚本吗? E. g。在上面的例子中,脚本类型将是 application / javascript (默认情况下),但respone的内容类型为 application / json 。为什么它仍然作为JavaScript执行?

&#xA;

1 个答案:

答案 0 :(得分:2)

浏览器往往对 tag value sample_id api_id 1 1 tag1 1 2 1 tag2 2 3 1 tag3 3 4 2 tag1 1 5 2 tag2 2 6 2 tag3 3 7 2 tag4 1 8 2 tag5 2 9 2 tag6 3 10 3 tag1 1 11 3 tag2 2 12 3 tag3 3 13 3 tag4 1 14 3 tag5 2 15 4 tag1 3 非常宽容。当JavaScript首次出现时,它没有标准化的content-type

这样做的结果是许多旧的Web服务器发送带有各种内容类型的JavaScript,并且几乎可以接受任何浏览器。如果浏览器请求了JavaScript,它会认为它已经返回并执行了它。

(甚至可以隐藏content-type内的JavaScript并让它执行。一旦引用:MultiIndex

由于网络基础设施的头号规则是“不要打破网络,”#34;没有人愿意改变脚本的安全模型,因此必须采取其他的解决方法。

换句话说 - 有人在那里提供常规JSON作为JSONP,如果浏览器拒绝执行它,世界将会看到浏览器被破坏 - 而不是网络服务器。

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