jQuery .text()方法是否安全?

我有来自用户的非转义数据。

那么这样使用是否安全:

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

我可以这样使用,还是有一些问题,如编码或一些特定的符号,我应该小心,并添加更严格的validation?

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

从jQuery文档 :

我们需要注意的是,这个方法会根据需要转义string,以便在HTML中正确呈现。 为此,它调用DOM方法.createTextNode() ,它用它们的HTML实体等价物(如&lt; for < )replace特殊字符

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

由于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;');​ 

将结果插入到DOM中时还需要小心 – 请参阅: 使用JavaScript和JQuery的跨站点脚本漏洞 。

但是,为了设置元素的文本,文本应该是XSS安全的。

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

…如果你知道注入值的上下文(即不是属性),那么这个方法是安全的。 我的观点是,开发人员不能很好地理解这些背景,迟早他们会弄错的。

最好使用stringreplace(至less< )。

从安全的库中的一些例子:

#1 OWASP的build议是:

规则#1 – 在将不可信数据插入到HTML元素内容之前的HTML转义

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

.text(data)会把<test></test>去掉,给你a&f#

是。 它处理文本,而不是代码。