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实体等价物(如<
for<
)replace特殊字符
所以是的,它应该是安全的。 这是你在jsfiddle中的例子 。 注意标记是如何显示为文本文本的。
由于XSS攻击依赖于能够插入DOM节点( <img />
, <script />
)等,而jQuery.fn.text()
不支持这个,所以XSS安全。
正如你在这个基本的例子中看到的那样,所有可能的HTML标签都是在内部使用createTextNode
的jQuery的结果进行编码的:
jQuery('div').text('<test>a&f"#</test>');
所以实际插入的东西更加平等。
jQuery('div').html('<test>a&f"#</test>');
将结果插入到DOM中时还需要小心 – 请参阅: 使用JavaScript和JQuery的跨站点脚本漏洞 。
但是,为了设置元素的文本,文本应该是XSS安全的。
作者从http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/反对使用;createTextNode
或jQuery的.text()
。
…如果你知道注入值的上下文(即不是属性),那么这个方法是安全的。 我的观点是,开发人员不能很好地理解这些背景,迟早他们会弄错的。
最好使用stringreplace(至less<
)。
从安全的库中的一些例子:
- 小胡子https://github.com/janl/mustache.js/blob/master/mustache.js#L55
- Angular https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L438
#1 OWASP的build议是:
规则#1 – 在将不可信数据插入到HTML元素内容之前的HTML转义
与.html()方法不同,.text()可以在XML和HTML文档中使用。 .text()方法的结果是一个包含所有匹配元素的组合文本的string。 (由于不同浏览器中HTMLparsing器的不同,返回的文本可能会在换行符和其他空白处有所不同)。
.text(data)
会把<test></test>
去掉,给你a&f#
是。 它处理文本,而不是代码。