createTextNode是否完全安全,可避免HTML注入和XSS攻击?

16

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

这种方法是否避免了HTML注入、跨站脚本攻击(XSS)以及用户可能做的所有其他恶意行为?

2个回答

16

它创建了一个纯文本节点,因此就这方面而言是可以的。

然而,如果使用不安全的方法从输入数据渠道获取数据来使用createTextNode,就有可能创建一个XSS问题。

例如,以下方式是不安全的

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

... 但是危险来自于 PHP 的 echo,而不是 JavaScript 的 createTextNode


4
PHP在将页面发送给客户端之前构建页面的文本内容。攻击者可以向PHP脚本提供像 '); alert('you just got xssed! 这样的值,然后PHP将在页面上构建一个功能失常的脚本,而客户端并不知道该脚本在离开服务器之前被篡改了。如果您没有使用服务器端语言,则不会遇到这个问题。 - apsillers
1
@Quentin,我有同样的问题,所以根据你的回答,使用createTextNode()在JS中是安全的,因为我认为它会将任何输入存储为文本,并且浏览器会显示它而不解释它。这正确吗? - aName
2
我不理解这个例子。document.createTextNode()不是在客户端/浏览器上运行,而php在服务器端运行,因此这不是一个问题吗? 我想你可以在服务器端运行JavaScript,构建DOM,然后将其全部输出到文件中,并运行文件的内容以执行其中的任何PHP代码,但我不认为这是服务器端JS通常的工作方式... - still_dreaming_1
1
这个答案很危险,而且自相矛盾。我要编辑它并删除大部分的回答,除非你能为此辩护。说它既避免了这些问题又容易受到攻击是矛盾的。漏洞的例子毫无意义,因为它只是一些 PHP 代码在 JavaScript 字符串中。 - still_dreaming_1
2
@still_dreaming_1 很抱歉回复晚了。PHP的示例是为了展示PHP在后端生成JavaScript,然后才将JS片段发送到前端的情况。但这只会让原问题更加混乱,因为它演示了PHP后端如何容易受到XSS攻击,但似乎也将createTextNode归咎于此。 - Cigarette Smoking Man
显示剩余9条评论

2

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

(兄弟回答包含易受XSS攻击的PHP片段,增加了混淆。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接