gpt4 book ai didi

jquery - 在不受信任的 URL 上调用 getJSON() 是否安全?

转载 作者:行者123 更新时间:2023-12-03 22:40:10 26 4
gpt4 key购买 nike

调用 jQuery 的 $.getJSON() 安全吗?使用来自不受信任的来源(例如另一个用户)的 URL 参数?换句话说,拨打 $.getJSON() 安全吗?使用不受信任的 URL?我会小心不信任响应并安全地处理响应,但是调用本身是否会带来安全风险?

换句话说,我说的是这样的事情:

$.getJSON(url_from_user, function(...) { ... handle response safely ...});

或者
$.getJSON('http://evil.com/foo.json', function(...) {...});

如果某些不受信任的用户为 url_from_user 提供恶意值,这是否允许代码注入(inject)或 XSS?或者如果有人恶意控制 evil.com地点?再次假设返回的任何 JSON 对象都将被安全处理。

我做过的更多细节和研究

documentation for getJSON没有说明这种情况是否安全。从逻辑上讲,我希望这个场景是安全的,因为我希望 jQuery 的实现通过 XHR 下载 JSON 对象的文本,使用安全的 JSON 解析器解析该文本,然后返回 JSON 对象。

但是,看了jQuery源代码后,我有些怀疑这是否安全。浏览 the source code for jQuery ,看起来这种情况可能允许 XSS。 getJSON() 的代码有点复杂(参见 src/ajax.js ),但它似乎选择了一个“传输”,然后用它来发送 AJAX 请求。我看到了 src/ajax/script.js注册一个叫做“script tag hack transport”的传输。这种传输的工作原理大致如下:它向文档添加一个脚本标签,例如, <script src="http://evil.com/foo.json"> ,并注册一个在下载的脚本执行时运行的 onload 处理程序。换句话说,如果站点由攻击者控制,“脚本标签黑客传输”从根本上是不安全的:它将攻击者控制的脚本包含到文档中并执行它。除了脚本标签 hack 传输之外,还有一个使用浏览器的 XMLHttpRequest() API 的 XHR 传输。我很难遵循确定在何种条件下使用“脚本标签黑客”传输的曲折逻辑。

所以,回到我最初的问题,拨打 $.getJSON() 安全吗?使用用户提供的 URL?如果在某些条件下它可能不安全,那么在什么条件下(例如,浏览器版本)它是安全的/不安全的?

最佳答案

除非您将请求配置为从不使用 JSONP(在某些情况下 jQuery 会自动尝试用于某些跨源请求),否则使用 $.getJSON() 是不安全的。针对任何随机的外国 URL。

如果 jQuery 切换到 JSONP,那将直接启用从另一个源到您的页面的脚本注入(inject),因为 JSONP 通过脚本注入(inject)精确工作(为了规避常规 Ajax 调用的同源限制)。

为了防止这种类型的误用,您必须防止任何 JSONP 的使用,并且必须研究在 jQuery 中做到这一点的最可靠方法。你也许可以切换到 $.ajax()您可以在其中指定更多选项来控制事物。

如果这是我的代码,我可能会想在这个 Ajax 调用中完全跳过 jQuery,而只使用我自己的 xmlHttpRequest反对绝对保证它只执行纯 Ajax 调用(不回退到任何其他传输,如 JSONP)。

更新:

我一直试图找到一种情况,其中 $.getJSON()将在 jsFiddle 上的各种测试场景中发出 JSONP 请求。我一直没能找到一个。要么目标站点有一个允许跨源请求的 Access-Control-Allow-Origin header ,在这种情况下 jQuery 只会执行跨源 Ajax 调用,或者它没有 header 而 jQuery 只会失败 getJSON()称呼。因此,看起来需要对特定版本的 jQuery 进行一些认真的研究,才能确定在您没有明确要求的情况下,它是否真的可以被欺骗以某种“自动”模式进行 JSONP 调用。

更新 2:发现实际漏洞

我发现了一个漏洞。如果 URL 发送到 $.getJSON()包含查询参数 callback= ,然后 jQuery 将执行 JSONP,目标主机可以在响应中注入(inject)它想要的任何脚本。

这是一个使用可公开访问的 Flickr JSONP 端点的演示:

http://jsfiddle.net/jfriend00/z6ah9eh2/

这不会做任何恶意的事情,但它确实通过 $.getJSON() 执行由目标站点决定的任意 Javascript。 .因此,它绝对容易通过 JSONP 进行代码注入(inject)。

这是来自 $.getJSON() 的 jQuery 文档的引用。 :

If the URL includes the string "callback=?" (or similar, as defined by the server-side API), the request is treated as JSONP instead.



并且,“被视为 JSONP”意味着它将插入一个脚本标签,并从 URL 中的站点请求和运行脚本 - 如果您使用 JSONP 访问不受信任的站点,则会打开跨站点脚本漏洞。

JSON 背后的想法之一是它可以使用严格遵守 JSON 规范的纯文本解析器进行解析,除了纯 JSON 之外,没有任何东西是允许或可以通过的。如果有人试图将一些 Javascript 代码隐藏到 JSON 字符串中,任何半体面的 JSON 解析器只会将 JSON 拒绝为无效并抛出异常。在正确的世界中( $.getJSON()),JSON 不是用 Javascript 解析器解析的,而是用它自己的文本解析器解析的,该解析器只接受有效的 JSON,不接受其他 Javascript 结构。

这是一个安全可靠的 JSON 解析器实现背后的想法,据信 $.getJSON()使用(在任何解析器中总是可能存在未知的错误,但已经完成了将其设计为安全的工作)。

所以,这个障碍已经过去了。没有任何技巧可以插入到一段 JSON 中,该段 JSON 被一个像样的 JSON 解析器解析,会导致后门代码注入(inject)。

现在,另一个障碍取决于您对 JSON 本身的处理方式以及您对 JSON 的处理或使用是否会导致潜在的不良行为。

例如,如果您从 JSON 中提取一个字符串属性并将其作为对象上的方法执行,而没有检查该字符串是否为预期值,那么您的代码可能会被诱骗执行您执行的方法不打算。这仍然不会将代码插入到您的页面中,但它确实会执行您不打算执行的操作。您可以通过在使用数据之前对数据进行适当的验证来避免这种情况。因此,如果如您所说,您正在安全地使用 JSON,那么这应该不是问题。

关于jquery - 在不受信任的 URL 上调用 getJSON() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29022794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com