createTextNode 对 HTML 注入和 XSS 是不是完全安全?

Posted

技术标签:

【中文标题】createTextNode 对 HTML 注入和 XSS 是不是完全安全?【英文标题】:Is createTextNode completely safe from HTML injection & XSS?createTextNode 对 HTML 注入和 XSS 是否完全安全? 【发布时间】:2012-07-24 04:03:58 【问题描述】:

我正在开发一个单页 web 应用程序。我通过直接创建 DOM 节点来进行渲染。特别是,通过使用document.createTextNode("user data") 创建文本节点,将所有用户提供的数据添加到页面。

这种方法是否避免了任何可能的 html 注入、跨站脚本 (XSS) 以及用户可能做的所有其他邪恶事情?

【问题讨论】:

【参考方案1】:

它创建一个纯文本节点,所以是的,就它而言。

虽然使用不安全的方法从输入到createTextNode 的任何通道获取数据,但可能会造成 XSS 问题。

例如以下将是不安全

document.createTextNode('<?php echo $_GET['xss']; ?>');

...但危险来自 PHP echo,而不是 javascript createTextNode

【讨论】:

PHP 在发送到客户端之前构建页面文本。攻击者可以向 PHP 脚本提供类似'); alert('you just got xssed! 的值,然后在页面上构建一个故障脚本,客户端会运行它,而不知道脚本在离开服务器之前已被更改。如果您不使用服务器端语言,这不是问题。 @Quentin,我有同样的问题,所以从你的回答来看,使用 JS 时使用 createTextNode() 是安全的,因为我假设它接受任何输入,将其存储为 txt , 并且浏览器显示它而不解释它。对吗?? 我不明白这个例子。 document.createTextNode() 不会在客户端/浏览器端运行,而 php 不会在服务器端运行,因此这不是问题吗?我想你可以在服务器端运行 JavaScript,构建 DOM,然后将其全部输出到文件中,然后运行文件的内容,从而执行其中的任何 PHP 代码,但我不认为服务器端 JS 通常是这样的工作... 这个答案很危险,而且自相矛盾。除非您可以捍卫答案,否则我将对其进行编辑并删除大部分答案。说它既避免了这些问题又容易受到这些问题的影响是矛盾的。漏洞示例没有意义,也无关紧要,因为它只是 JavaScript 字符串中的一些 PHP 代码。 @still_dreaming_1 回复迟了抱歉。 PHP 示例展示了 PHP 在后端生成 JavaScript,然后才将 JS sn-p 发送到前端的情况。但这只会增加对原始问题的混淆,因为它展示了 PHP 后端 如何容易受到 XSS 的攻击,但似乎createTextNode 也应该受到责备。跨度> 【参考方案2】:

是的,它是 XSS 安全的,就像使用 someElement.innerText = "..." 一样。

(兄弟答案通过包含易受 XSS 攻击的 PHP sn-p 来增加混乱。)

【讨论】:

以上是关于createTextNode 对 HTML 注入和 XSS 是不是完全安全?的主要内容,如果未能解决你的问题,请参考以下文章

JS 中的 createTextNode 在 Chrome 中不起作用

createTextNode() 方法和createTextNode()方法

将 HTML 实体放入 document.createTextNode

使用 createTextNode() 但我需要向其添加 HTML 标记 (JavaScript/JQuery)

PHP createTextNode() 使用 saveHTML() 仅显示文本

innerHTML 和 document.createTextNode 有啥区别 [重复]