javascript xss攻击 - jQuery.text()方法XSS安全吗?




xss防御 js安全 (6)

我有来自用户的未转发数据。

所以这样使用是安全的:

var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
    $('body').text(data);

我可以像这样使用或者有一些问题,比如编码或某些特定的符号,我应该小心并添加更严格的验证?


Answers

与.html()方法不同,.text()可以在XML和HTML文档中使用。 .text()方法的结果是一个包含所有匹配元素的组合文本的字符串。 (由于不同浏览器中HTML解析器的变化,返回的文本可能会在换行符和其他空格中有所不同。)

.text(data)将剥离<test></test>并给你a&f#


来自http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/的作者反对使用createTextNode或jQuery的.text()

...如果您知道注入值的上下文(即非属性),则此方法是安全的。 我的论点是,开发人员不能很好地理解这些背景,迟早他们会弄错。

最好使用字符串替换(至少为< )。

来自安全性良好的库的一些示例:

#1 OWASP的建议是:

规则#1 - 在将不受信任的数据插入HTML元素内容之前进行HTML转义


因为XSS攻击依赖于能够插入DOM节点( <img /><script /> )等,而jQuery.fn.text()不支持这一点,所以它完全是XSS安全的。

正如您在此基本示例中所看到的,所有可能的HTML标记都是在内部使用createTextNode作为jQuery的结果进行编码的:

jQuery('div').text('<test>a&f"#</test>');​

因此实际插入的内容更加平等;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​

当您使用text方法设置元素的text ,jQuery在内部使用createTextNode ,它会转义所有特殊字符。

来自jQuery文档

我们需要注意,此方法会根据需要转义提供的字符串,以便在HTML中正确呈现。 为此,它调用DOM方法.createTextNode() ,它将特殊字符替换为其HTML实体等价物(例如&lt; for <

所以是的,它应该是安全的。 这是你在jsfiddle中例子 。 请注意标记如何显示为文字文本。



当这个问题得到解答时,这是不可用的,但您也可以使用live()方法来启用/禁用事件。

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

此代码会发生什么情况是,当您单击#mydisablebutton时,它会将禁用的类添加到#myimage元素。 这将使得选择器不再匹配元素,直到'disabled'类被移除后,事件才会被触发,使得.live()选择器再次有效。

通过添加基于该类的样式,还有其他好处。





javascript jquery security xss