10

有谁知道是否保证 DOMNode类型Text不会被浏览器解释为 HTML?

更多细节如下。

背景

我正在为朋友构建一个简单的网络评论系统,并且一直在考虑 XSS 攻击。我不认为过滤或转义 HTML 标签是一个非常优雅的解决方案——想出一个会滑过过滤器的卷积太容易了。根本问题是我想保证,对于某些内容(即随机未经身份验证的网络用户发布的内容),浏览器永远不会尝试解释或运行内容。

一个普通的(文本)开始

想到的第一个想法就是使用Content-Type: text/plain,但这必须适用于整个页面。您可以将纯文本IFRAME放在页面中间,但它很丑陋,并且如果用户单击框架会产生焦点问题。

内部文本/文本内容/JQuery

事实证明,有一些特定于浏览器的属性(innerText在 IE、textContentFF、Safari 等中)在设置时需要创建单个Text节点。

JQuery 试图通过实现一个text(val)跳过特定于浏览器的属性并直接转到的函数来避免特定于浏览器的属性的差异document.createTextNode(text),正如您可以猜到的那样,它创建了一个Text节点。

W3 Text NodeDOM

所以我认为这接近我想要的,它看起来不错——Text节点不能有子节点,而且看起来它们不能被解释为 HTML。但我不能从官方文档中 100% 确定。

其中的部分textContent特别令人鼓舞,因为它说“在设置时,也不执行解析,输入字符串被视为纯文本内容”。但这是所有Text节点的基础,还是只有您设置的节点textContent?这可能看起来像是一个愚蠢的狡辩,但它可能很重要,因为IE 不支持textContent(见上文)。

回到最初的问题

任何人都可以确认/拒绝这将起作用吗?也就是说,兼容 w3 DOM 的浏览器永远不会将节点解释Text为 HTML,无论内容是什么?我会非常感激能解决这个令人痛苦的小不确定性。

感谢您的时间!

4

2 回答 2

6

是的,这一点得到了证实,在某种程度上,对于任何不是浏览器的浏览器,该浏览器都会有严重的缺陷。呈现除文本之外的任何内容的文本节点将是矛盾的。通过使用 document.createTextNode("some string"); 并附加该节点,保证字符串呈现为文本。

于 2009-01-24T22:58:35.323 回答
0

我不认为过滤或转义 HTML 标签是一个非常优雅的解决方案——想出一个会滑过过滤器的卷积太容易了

这绝对是不真实的,过滤 > 到 > 和 < 到 < 将完全停止任何 HTML 注入。

于 2009-01-24T22:52:53.167 回答