- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
调用 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 对象都将被安全处理。
<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.
$.getJSON()
),JSON 不是用 Javascript 解析器解析的,而是用它自己的文本解析器解析的,该解析器只接受有效的 JSON,不接受其他 Javascript 结构。
$.getJSON()
使用(在任何解析器中总是可能存在未知的错误,但已经完成了将其设计为安全的工作)。
关于jquery - 在不受信任的 URL 上调用 getJSON() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29022794/
我正在尝试获取客户端的 IP 地址和 GPS 坐标。使用 jQuery,我有这个: $.getJSON("http://jsonip.appspot.com/", function(data) {
这个问题已经有答案了: Why does JQuery.getJSON() have a success and a done function? (2 个回答) 已关闭 6 年前。 我想知道这两个代
所以首先,是的,我知道有几个答案,但没有一个能够解决我的问题。首先我将展示我的代码HTML: Shop
假设我有以下 JavaScript: (function($) { $.getJSON(url, function(data) { $.each(data.rows, function(i
是否可以使用 jQuery 在另一个 getJSON 请求中使用 getJSON 请求? 像这样: // Population the Requests List // jQuery AJAX cal
我有以下代码,该代码已针对此问题进行了简化。基本上我有一个循环,在每次迭代中调用 jquery getJSON 函数,调用 API 端点来获取一些天气数据。问题是,当 getJSON 请求被触发时,我
我有一个使用 getJSON 的函数,但它没有像我预期的那样工作。 function balbla(name, param) { $.getJSON("/blabla.json?nam
我有一段代码,例如: $.getJSON("http://mysite.org/polls/saveLanguageTest?url=" + escape(window.location.href)
我正在使用jquery.getJSON() ,但我不知道如何进行错误处理。这些是我需要处理的一些情况。 1)如果返回的数据为null怎么办? 2)如果返回的数据不能解析json怎么办? 3) 如果返回
我正在通过参与一个测试项目(包括 SubSonic 和 jQuery)来学习 asp.net mvc。 我遇到的问题是,每次我想要返回的不仅仅是简单字符串(例如 Json 对象)时,我都会遇到困难,因
执行跨域查询,如果运行的URL不可用(404),如何执行某个功能?我尝试这样的事情: $.getJSON({ url:'example.php?callback=?', statusCode: { 4
我在 jQuery 中搜索了相关主题,但没有找到任何方法来解决我的问题。 $(document).ready(function(){ $("#inputForm").submit(functi
当调用 yahoo Web 服务 (http://boss.yahooapis.com/ysearch) 返回数据集时,是否可以设置超时并在超时后退出例程? jQuery.getJSON("http:
我正在使用 jQuery getJSON() 函数。这个函数获取数据没有问题。但有时等待,等待等待......我的加载栏在页面中心显示加载加载。 所以 jQuery ajax() 函数有一个超时变量。
我有一个 html 代码: asd $('button').click( function() { $.getJSON('/schedule/test/', function
目标:我所追求的是每次在数据库中添加某些内容时(在 $.ajax 到 Submit_to_db.php 之后),从数据库获取数据并刷新 main.php(通过 draw_polygon 更明显)。 所
我已经阅读了文档并用谷歌搜索了此内容,但没有看到问题所在。我正在尝试从本地 json 文件获取一些数据。我已在 JSONLint 验证了响应数据 代码 $(document).ready(functi
我在json.getJSON方法上遇到麻烦。这是我当前的代码: var jqxhr = $.getJSON("http://127.0.0.1:5002?callback=?", function()
我需要进行跨域请求,并且 getJSON 有问题。 $.getJSON("http://usr:pwd@10.0.1.xx/cgi-bin/remote/request.cgi?m=json&r=gr
这个问题已经有答案了: How do I return the response from an asynchronous call? (42 个回答) 已关闭 8 年前。 这是我的问题 我有一个充满
我是一名优秀的程序员,十分优秀!