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

例:

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

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

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

是的,XSS攻击是可能的。

 var input = "" $(input).appendTo("body"); 

见演示 。 似乎jQuery团队已经承认了这一点 ,并计划在jQuery 1.9中解决它。

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

 var input = "" $($.parseHTML(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,在某些情况下这是可能的。 这是在1.6.3版本中修复的(这是提交 )。 另请参阅相应的错误报告 。

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

 jQuery( '#' ).appendTo("#qunit-fixture"); 

使用1.6.3之前的jQuery版本,可以使用onerror代码。

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

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

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

例如,如果untrusted_js_code:input ,则转换为:

 $("#:input") 

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

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

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