jQuery的$.get()可以安全地调用不受信任的URL吗?

前端之家收集整理的这篇文章主要介绍了jQuery的$.get()可以安全地调用不受信任的URL吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近才知道jQuery的$ .getJSON()是 not safe to call on an untrusted URL. $ .get()呢?当URL参数来自不受信任的来源时,jQuery的$ .get()可以安全地调用,还是不安全的?

这是在我正在做的安全代码检查中出现的,以检查XSS漏洞。示例代码模式

$.get(url,function (...) { ... })

如果攻击者恶意选择网址,此代码模式是否会创建XSS漏洞?

请假设该函数将安全地处理来自AJAX请求的响应,并且该URL来自不可信源(例如其他用户),并且可以被对手完全控制。

我的关注:如果攻击者选择了url,攻击者是否可以选择一个恶意URL(例如,包含callback =?并指向自己的站点,或者这样的一些聪明的东西),导致jQuery猜测数据类型应该是JSONP ,启用JSONP,将脚本标签插入文档,并引入XSS漏洞in the same way that getJSON() does? (由于我没有将明确的dataType参数传递给$ .get(),所以jQuery将猜测数据类型为described in the docs.我不知道这是什么安全性的影响。)

我在代码审查中遇到了这种代码模式,我试图了解这是否是一个潜在的漏洞。我不是在寻找替代方法这个代码可以写;相反,我想知道这种代码模式是否安全。

由于威胁模式有点棘手,让我举个例子来帮助我们更好地理解这一点。假设Bob是服务的用户,他可以提供与他的个人资料相关联的URL。假设当Alice在浏览器中访问Bob的个人资料页面时,页面上的Javascript代码将使用Bob提供的URL,并将其作为参数传递给$ .get()。问题是,这是安全吗?鲍勃可以用这个来攻击爱丽丝吗? Bob可以触发Alice的浏览器来执行任意的JavaScript代码,以及Alice的全部功能?当链接的问题解释时,$ .getJSON()在这种情况下是不安全的 – 但是$ .get()呢?还不安全,还是安全?

由于我有一些要求澄清的要求,请允许我以不同的方式解释/提出问题。假设我正在进行代码审查,以检查一些JavaScript代码是否包含任何XSS漏洞,我看到以下代码行:

$.get(url,function(resp) { /* do nothing */ });

假设我知道网址可以完全由攻击者控制。这是否自动成为XSS漏洞?还是这样总是安全的?或者如果答案是“这取决于”,它取决于什么?

或者,另一种想法的方式。假设我正在进行代码审查,我看到以下代码行:

$.get(url,f);

假设我知道网址可以完全由攻击者控制。我需要检查什么,以验证这是否安全(没有XSS错误)?我知道我需要检查f的代码,看它是否安全地处理响应,因为如果f不小心可能会引入XSS错误。我的问题是:我唯一需要检查的是?或者这个代码模式总是一个XSS漏洞,不管f是如何编码的?

解决方法

Does this code pattern create a XSS vulnerability,if an attacker chooses url malicIoUsly?

编辑:是的,但不是因为你的问题的原因。

使用ajaxPrefilter(“json jsonp”)将奇怪的自动JSONP功能内部应用于AJAX请求。所以它适用于json preilter列表,但不适用于其他类型或默认*。然而,在发生响应之前,预过滤器应用,因此这不能仅仅因为服务器使用JSON类型进行回复

(目前 – 从1.11.2开始 – getJSON的文档不会描述这种潜在危险行为正确触发的情况,而get和ajax的文档根本不提及自动JSONP,所以也许应该被认为是一个错误,当然,由于这个指定不清楚,所以我不会依赖它在将来版本的jQuery中保持不变。)

它的脆弱性(由framp和牙刷证明)的实际原因是没有dataType参数,jQuery会从响应中猜出一个。如果攻击者的URL访问作为类似JS的Content-Type的资源,那么jQuery会猜测它是JavaScript和eval。注意:对于AJAX请求获得足够的工作,对于第三方服务器上的资源,它必须包括CORS头。

$.get(url,function (...) { ... },'json');

此版本不容易受到响应类型猜测的影响。但是,它是容易受到自动JSONP过滤器的影响。

为了安全起见,您必须同时设置dataType选项,如果该选项是json,那么也可以使用jsonp:false选项。不幸的是,您不能在get()方法中设置jsonp选项。您应该能够通过传递选项字典而不是参数来实现,但是您不能因为此API目前完全无法使用,因为jQuery是一个令人遗憾的破坏的Do-What-I-Mean API的行为它越来越难以预测。

因此,从不受信任的网址获取JSON的唯一安全方法是通过基本的ajax:

$.ajax(url,{dataType: 'json',jsonp: false});
原文链接:https://www.f2er.com/jquery/182929.html

猜你在找的jQuery相关文章