Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以通过$()注入恶意javascript代码吗?_Javascript_Jquery - Fatal编程技术网

可以通过$()注入恶意javascript代码吗?

可以通过$()注入恶意javascript代码吗?,javascript,jquery,Javascript,Jquery,例如: if($('#' + untrusted_js_code).length) > 0 ....` 通常,“untrusted_js_code”应该是一个表示项目ID的简单字符串。变量的值来自iframe(通过postMessage),这就是它不可信的原因。我只是检查当前页面中是否存在该项,然后再处理它。截至2012年10月22日,jQuery 1.8.2: 是的,XSS攻击是可能的。 var input = "<script>alert('hello');</

例如:

if($('#' + untrusted_js_code).length) > 0
  ....`
通常,“untrusted_js_code”应该是一个表示项目ID的简单字符串。变量的值来自iframe(通过postMessage),这就是它不可信的原因。我只是检查当前页面中是否存在该项,然后再处理它。

截至2012年10月22日,jQuery 1.8.2: 是的,XSS攻击是可能的。

var input = "<script>alert('hello');</script>"
$(input).appendTo("body");
,没有警报


然而,在OP描述的情况下,以下内容:

var untrusted_js_code = 'alert("moo")';
$('#' + untrusted_js_code).show();
这将转化为:

$('#alert("moo")').show();

由于字符串中前面的#,jQuery将其作为CSS选择器,这一点很好地体现了出来,因为对于html来说,它不能有内嵌的JS代码,因此它相对安全。上面的代码只会告诉jQuery根据该ID查找DOM元素,导致jQuery无法找到该元素,因此不执行任何操作。

对于该语句,您要求jQuery执行基于选择器的查询。
作为选择器的字符串,它不会造成任何伤害。

它不像其他人所说的那么清楚。不受信任的代码将无法执行XSS(只要您有足够新的jQuery版本,正如balpha指出的),但它可能会挂起用户的浏览器或使您的代码接收到意外的输入

例如,如果
untrusted_js_code
:input
,则翻译为:

$("#:input")
而jQuery似乎只是忽略了
#
并匹配
:input
。说真的,打开一个控制台,在这个页面上运行这段代码。(这似乎仅适用于伪类。)

邪恶的一方可能会给你一个计算密集型选择器(非常简单的
:not(.asdf):not(.asdf)
数万次),这需要几秒钟(或几分钟…)来处理


(此外,还可能存在浏览器错误,因此可以构造一个选择器以使用户的web浏览器崩溃。)

是的,如果您使用的是较旧版本的jQuery,则在某些情况下可能会出现这种情况。这是在()中修复的。另请参阅

提交包括一个澄清问题的测试用例:

jQuery( '#<img id="check9521" src="no-such-.gif"' +
        'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");
jQuery(“#”).appendTo(“#qunit fixture”);
对于1.6.3之前的jQuery版本,将执行
onerror
代码


但是,您的特定示例(仅检查长度)没有这个问题。

我认为可以在旧版本中插入脚本(通过包含内联事件的HTML)。但也许我把这个bug和类似的东西混淆了。@ThiefMaster你是对的。1.6.3之前的版本容易受到一些XSS错误的影响,这些错误可能会诱使jQuery评估HTML而不是选择DOM元素<代码>var不受信任\u js\u代码=“”;jQuery(“#”+不可信的代码);代码提醒了JQueryeah,balpha在对这个问题的另一个回答中指出了这一点;我在这里添加了他的答案的链接,以防万一。再次更新。事实证明,jQuery 1.8.2仍然易受攻击,奇怪的是我们怎么会错过它。如果
untrusted_js_code
等于例如
“[某些东西]”
,它可能会导致语法错误。为什么在这样的位置使用不受信任的输入?无论如何,如果你想100%安全地使用
document.getElementById()
,而不是像
$()
@ThiefMaster这样强大的库函数,我已经查看了jQuery的源代码,据我所知,选择器实际上应该是安全的(没有我能看到的任何评估)是的,但是,如果您能够设法让函数运行其“创建DOM元素”部分而不是“通过选择器查找元素”部分,则您可以创建一个图像,例如,使用onload脚本。是的,但我们谈论的是发送该变量内容的同一用户。因此,他可以随意多次崩溃浏览器,我不在乎:)这是一个公平的观点,在最常见的情况下,用户只能崩溃自己的浏览器,但如果您存储ID或将其发送给其他用户,则可能会出现问题。
jQuery( '#<img id="check9521" src="no-such-.gif"' +
        'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");