2009-01-24 41 views
9

有没有人知道类型Text的DOM Node是否被浏览器保证不被解释为HTML?是否保证DOM文本节点不被解释为HTML?

更多详情如下。

背景

我建立一个简单的网页评论系统的朋友,我一直在思考XSS攻击。我不认为过滤或转义HTML标签是一个非常优雅的解决方案 - 它太容易想出一个卷积过滤器。基本问题是,我想保证,对于某些内容片段(即随机未经身份验证的网络用户POST的内容),浏览器永不尝试解释或运行内容。

一个平原(文本)开始

浮现在脑海的第一个念头就是使用Content-Type: text/plain,但有权申请一整页。您可以在页面中间放置一个明文IFRAME,但它很丑,并且如果用户点击框架,则会产生焦点问题。

的innerText /的textContent/JQuery的

事实证明,有一些特定浏览器(innerText在IE,textContent在FF,Safari等)的属性,当集,需要创建一个单个Text节点。

JQuery的尝试,以避免在特定浏览器的属性差异,通过实现单一功能text(val)一个跳过浏览器特定的属性,并直接进入document.createTextNode(text),其中,因为你可以猜到,创建一个Text节点。

W3 DOM TextNode小号

所以我觉得这是接近我想要的东西,它看起来good-- Text节点不能有孩子,而且似乎像他们不能被解释为HTML。但是我不能从官方文档中100%确定。

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

回到身边最初的问题

谁能确认/拒绝,这是否行得通呢?也就是说,一个w3 DOM兼容的浏览器将不会不会将解释为一个Text节点为HTML,不管内容是什么?我会非常感激这种折磨的小小的不确定性。

谢谢你的时间!

回答

5

是的,这是确认的,以至于对于什么浏览器它不是,该浏览器将有一个严重缺陷。呈现除文本之外的任何内容的文本节点都是矛盾的。通过使用document.createTextNode(“some string”);并附加该节点,该字符串是保证要呈现为文本。

0

我不认为过滤或逃避的HTML标签是一个非常优雅的解决方案 - 它太容易拿出的卷积,将滑过去的过滤器

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

+2

我立足于我的偏执: http://stackoverflow.com/questions/53728/will-html-encoding-prevent-all-kinds-of-xss-attacks 的http://博客。 stackoverflow.com/2008/06/safe-html-and-xss/ – elliot42 2009-01-24 22:58:59