例子:
if($('#' + untrusted_js_code).length) > 0
....`
通常,“untrusted_js_code”应该是一个简单的字符串,代表一个项目的 ID。变量的值来自 iframe(通过 postMessage),这就是它不受信任的原因。我只是检查该项目是否存在于当前页面中,然后才对其进行处理。
例子:
if($('#' + untrusted_js_code).length) > 0
....`
通常,“untrusted_js_code”应该是一个简单的字符串,代表一个项目的 ID。变量的值来自 iframe(通过 postMessage),这就是它不受信任的原因。我只是检查该项目是否存在于当前页面中,然后才对其进行处理。
是的,XSS 攻击是可能的。
var input = "<script>alert('hello');</script>"
$(input).appendTo("body");
见演示。jQuery 团队似乎已经承认了这一点,并计划在 jQuery 1.9 中解决这个问题。
从 jQuery 1.8 开始,$.parseHTML
如果您希望用户输入是 html,请使用:
var input = "<script>alert('hello');</script>"
$($.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( '#<img id="check9521" src="no-such-.gif"' +
'onerror="jQuery._check9521(false)">' ).appendTo("#qunit-fixture");
对于 1.6.3 之前的 jQuery 版本,onerror
代码会被执行。
但是,您的特定示例(仅检查长度)没有此问题。
使用该语句,您要求 jQuery 基于选择器执行查询。作为选择器的字符串,它不会造成任何伤害。
这不像其他人说的那么清楚。不受信任的代码将无法进行 XSS(只要您有足够新的 jQuery 版本,正如 balpha 指出的那样),但它可以挂起用户的浏览器或使您的代码收到意外的输入。
例如,如果untrusted_js_code
是:input
,则翻译为:
$("#:input")
并且 jQuery 似乎只是忽略了#
and 上的匹配:input
。说真的,打开一个控制台并在这个页面上运行那段代码。(这似乎只适用于伪类。)
一个邪恶的一方可能会给你一个计算密集型的选择器(非常简单:not(.asdf):not(.asdf)
地数万次),它需要几秒钟(或几分钟......)来处理。
(此外,浏览器可能存在错误,因此可以构造一个选择器来使用户的 Web 浏览器崩溃。)