用jQuery获取JSON数据是否安全?

JSON允许您从AJAX调用中检索多种格式的数据 。 例如:

$.get(sourceUrl, data, callBack, 'json'); 

可用于从sourceUrl获取和解析JSON代码。

JSON是用于描述数据的简单JavaScript代码。 这可以通过JavaScript解释器来回避,以获得数据结构。

从远程来源评估代码通常是个坏主意。 我知道JSON规范并没有特别允许函数声明,但是没有理由你不能在代码中包含一个并且有一个不安全和天真的消费者编译/执行代码。

jQuery如何处理解析? 它评估此代码吗? 有哪些保护措施可以阻止某人破解sourceUrl并散布恶意代码?

我最后一次看到(2008年末)JQuery函数get()getJSON()等内部eval JSon字符串,因此暴露于与eval相同的安全问题。

因此,在使用任何forms的eval()之前,使用validationJSON字符串以确保它不包含任何狡猾的非JSON javascript代码的解析函数是一个非常好的主意。

您可以在https://github.com/douglascrockford/JSON-js/blob/master/json2.js找到这样的function。

有关此领域的详细讨论,请参阅JSON和Broswer Security 。

总之,使用JQuery的JSON函数而不解析输入JSON(使用上面的链接函数或类似函数)并非100%安全。

注意:如果getJSON中仍然缺少这种解析(最近可能已经添加),那么从JQuery参考文档中了解由于跨域function而导致的风险更为重要:

从jQuery 1.2开始,如果指定了JSONP回调,则可以加载位于另一个域上的JSON数据,这可以这样做:“myurl?callback =?”。 jQuery自动替换? 使用正确的方法名称来调用,调用指定的回调。

$.getJSON()用于从远程源执行(而不是使用eval )javascript代码(如果指定了回调,则使用JSONP惯用法)。 使用这种方法时,完全由您来信任来源,因为他们可以控制整个页面(他们甚至可以发送cookie)。

来自Douglas Crockford网站关于The Script Tag Hack (jsonp):

因此脚本可以访问和使用其cookie。 它可以使用用户的授权访问源服务器。 它可以检查DOM和JavaScript全局对象,并发送它在世界任何地方找到的任何信息。 Script Tag Hack不安全,应该避免。

IE 8和Firefox 3.1都支持原生JSON,它将提供eval()的安全替代方案。 我希望其他浏览器也会效仿。 我还希望jQuery改变它的实现以使用这些本机方法。

我所知道的所有浏览器都通过Ajax禁用跨站点请求。 也就是说,如果您的页面位于my.example.com上,则除非其URL也位于my.example.com,否则无法使用Ajax加载任何内容。

这实际上可能是令人讨厌的事情,并且攻击者有其他方式以其他方式注入源,但表面上这种限制是为了解决您提到的问题。