示例:
if($('#' + untrusted_js_code).length) > 0
....`
通常,“untrusted_js_code”应该是表示项目ID的简单字符串。变量的值来自iframe(通过postMessage),这就是它不受信任的原因。而我只是检查当前页面中是否存在该项目,然后才对其进行处理。
答案 0 :(得分:14)
是的,可以进行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浏览器崩溃。)