当脚本显示在 HTML 文本区域中时,是否可能受到 XSS 攻击



我的UI中有一个HTML文本区域(用于基于Java的Web应用程序),用户可以在其中输入任何值。保存后,它将显示在浏览器的文本区域(已禁用)中。

如果用户在文本区域中

以自由文本形式输入任何脚本,它是否会作为脚本执行(即使该值显示在文本区域中,而不是作为标签/文本)?

这取决于您如何设置textarea的值。在 HTML 代码中,textarea的内容是元素内的文本。

我创建了一个 JSFiddle 来演示更改textarea内容的各种方法

<div><textarea id="e1"></textarea></div>
<div><textarea id="e2"></textarea></div>
<div id="e3"/>
var dangerous = '<scri' + 'pt>alert("Danger!");</scri' + 'pt>';
document.getElementById('e1').value = dangerous;
document.getElementById('e2').innerHTML = dangerous;
dangerous = '</textarea>' + dangerous;
var content = '<textarea>' + dangerous + '</textarea>';
document.getElementById('e3').innerHTML = content;
console.log('Done.');

这将创建两个textarea元素,其中包含一个脚本(保存)和一个空脚本。

在最后一个测试中,我关闭输入中的textarea,然后附加脚本。有趣的是,在这种情况下,设置innerHTML是安全的:它不会执行以这种方式插入的脚本。

所以只要你在JavaScript中做到这一点,你就非常安全。但通常,您在服务器上呈现页面的 DOM,然后必须确保正确转义textarea的内容,因为:

String unfilteredInput = "</textarea><script>alert("Danger!");</script>";
out.write("<textarea>");
out.write(content);
out.write("</textarea>");

将执行脚本。

注意:我也试图演示document.write()但这在JSFiddle中是不允许的。我很确定document.write()容易受到同样的攻击。

最新更新