jQuery .text()方法XSS安全吗?

时间:2012-03-16 09:53:12

标签: javascript jquery security xss

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

这样使用是安全的:

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

我是否可以像这样使用或者存在编码或某些特定符号等问题,我应该小心并添加更严格的验证?

6 个答案:

答案 0 :(得分:55)

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

来自jQuery docs

  

我们需要知道此方法会转义提供的字符串   必要的,以便它在HTML中正确呈现。为此,它打电话   DOM方法.createTextNode(),它取代了特殊字符   与他们的HTML实体等价物(例如&lt;的{​​{1}})

是的,它应该是安全的。这是your example in jsfiddle。请注意标记如何显示为文字文本。

答案 1 :(得分:14)

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

正如您在此basic example中所看到的,所有可能的HTML标记都是在内部使用createTextNode的jQuery编码的结果:

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

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

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

答案 2 :(得分:8)

将结果插入DOM时仍需要小心 - 请参阅:Cross-Site Scripting vulnerability with JavaScript and JQuery

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

答案 3 :(得分:1)

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

  

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

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

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

#1 OWASP suggestion是:

  

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

答案 4 :(得分:0)

  

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

.text(data)会剥离<test></test>并离开a&f#

答案 5 :(得分:-1)

是。它涉及文本,而不是代码。