可以通过$()注入恶意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浏览器崩溃。)