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

时间:2012-06-23 13:29:59

标签: javascript jquery

示例:

if($('#' + untrusted_js_code).length) > 0
  ....`

通常,“untrusted_js_code”应该是表示项目ID的简单字符串。变量的值来自iframe(通过postMessage),这就是它不受信任的原因。而我只是检查当前页面中是否存在该项目,然后才对其进行处理。

4 个答案:

答案 0 :(得分:14)

截至2012年10月22日,jQuery 1.8.2:

是的,可以进行XSS攻击。

var input = "<script>alert('hello');</script>"
$(input).appendTo("body");

See demo。似乎jQuery团队有acknowledged this并且计划在jQuery 1.9中解决它。

从jQuery 1.8开始,如果您希望用户输入为html,请使用 $.parseHTML

var input = "<script>alert('hello');</script>"
$($.parseHTML(input)).appendTo("body");​

See demo,没有提醒。


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

var untrusted_js_code = 'alert("moo")';
$('#' + untrusted_js_code).show();

将转换为:

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

这是由jQuery作为CSS选择器所代表的,这要归功于字符串中的前面的#,而对于html而言,它不能具有内联JS代码,所以它相对安全。上面的代码只会告诉jQuery按该ID查找DOM元素,导致jQuery无法找到该元素,从而无法执行任何操作。

答案 1 :(得分:9)

是的,如果您使用的是旧版本的jQuery,在某些情况下这是可能的。这已在here's the commit中修复(version 1.6.3)。另请参阅corresponding bug report

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

jQuery( '#<img id="check9521" src="no-such-.gif"' +
        'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");

使用1.6.3之前的jQuery版本,onerror代码将被激活。

您的特定示例(仅检查长度)不存在此问题。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

$("#:input")

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

一个邪恶的派对可以给你一个计算密集的选择器(非常简单:not(.asdf):not(.asdf)成千上万次),这需要几秒钟(或几分钟......)来处理。

(此外,还存在浏览器错误的可能性,因此可能构建选择器以使用户Web浏览器崩溃。)