某些网络服务器使用添加JSON响应,而(1);
,e。 G。 <代码>而(1); [ 'ID',123] 代码>。
这是为了防止 JSON劫持:
&#xA;&#xA;&#xA;&#xA;&#xA;这是为了确保其他一些网站无法做出令人讨厌的伎俩来尝试&#xA;窃取你的数据。例如,通过替换数组构造函数,然后&#xA;通过标签包含此JSON URL,恶意第三方&#xA;站点可以窃取JSON响应中的数据。通过放一个&#xA;而(1);在开始时,脚本将挂起。 @bdonlan, https://stackoverflow.com/a/871508/1647737
&#xA;
然而,这种“误用”JSON内容作为&lt; script&gt;
源是唯一可能的,因为webbrowsers(例如Firefox)执行内容类型的脚本 application / json
:
&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; application / javascript
(默认情况下),但respone的内容类型为 application / json
。为什么它仍然作为JavaScript执行?&#xA;
答案 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提供参考链接并为我建立时间表。)