有谁知道是否保证 DOMNode
类型Text
不会被浏览器解释为 HTML?
更多细节如下。
背景
我正在为朋友构建一个简单的网络评论系统,并且一直在考虑 XSS 攻击。我不认为过滤或转义 HTML 标签是一个非常优雅的解决方案——想出一个会滑过过滤器的卷积太容易了。根本问题是我想保证,对于某些内容(即随机未经身份验证的网络用户发布的内容),浏览器永远不会尝试解释或运行内容。
一个普通的(文本)开始
想到的第一个想法就是使用Content-Type: text/plain
,但这必须适用于整个页面。您可以将纯文本IFRAME
放在页面中间,但它很丑陋,并且如果用户单击框架会产生焦点问题。
内部文本/文本内容/JQuery
事实证明,有一些特定于浏览器的属性(innerText
在 IE、textContent
FF、Safari 等中)在设置时需要创建单个Text
节点。
JQuery 试图通过实现一个text(val)
跳过特定于浏览器的属性并直接转到的函数来避免特定于浏览器的属性的差异document.createTextNode(text)
,正如您可以猜到的那样,它创建了一个Text
节点。
W3 Text
Node
DOM
所以我认为这接近我想要的,它看起来不错——Text
节点不能有子节点,而且看起来它们不能被解释为 HTML。但我不能从官方文档中 100% 确定。
- 接口
Node
:http ://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247 - 接口
Text
:http ://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1312295772 textContent
:http ://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent
其中的部分textContent
特别令人鼓舞,因为它说“在设置时,也不执行解析,输入字符串被视为纯文本内容”。但这是所有Text
节点的基础,还是只有您设置的节点textContent
?这可能看起来像是一个愚蠢的狡辩,但它可能很重要,因为IE 不支持textContent
(见上文)。
回到最初的问题
任何人都可以确认/拒绝这将起作用吗?也就是说,兼容 w3 DOM 的浏览器永远不会将节点解释Text
为 HTML,无论内容是什么?我会非常感激能解决这个令人痛苦的小不确定性。
感谢您的时间!