我有来自用户的未转义数据。
这样使用是安全的:
var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
$('body').text(data);
我是否可以像这样使用或者存在编码或某些特定符号等问题,我应该小心并添加更严格的验证?
答案 0 :(得分:55)
当您使用text
方法设置元素的文本时,jQuery会在内部使用createTextNode
,这会转义所有特殊字符。
来自jQuery docs:
我们需要知道此方法会转义提供的字符串 必要的,以便它在HTML中正确呈现。为此,它打电话 DOM方法
.createTextNode()
,它取代了特殊字符 与他们的HTML实体等价物(例如<
的{{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('<test>a&f"#</test>');
答案 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 - 在将不受信任的数据插入HTML元素内容之前将HTML转义
答案 4 :(得分:0)
与.html()方法不同,.text()可以在XML和HTML中使用 文档。 .text()方法的结果是一个包含的字符串 所有匹配元素的组合文本。 (由于HTML的变化 在不同浏览器中的解析器,返回的文本可能在换行符中有所不同 和其他白色空间。)
.text(data)
会剥离<test></test>
并离开a&f#
答案 5 :(得分:-1)
是。它涉及文本,而不是代码。