6

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

如果用户在 textarea 中输入任何脚本作为自由文本,它是否会作为脚本执行(即使值显示在 textarea 中,而不是作为标签/文本)?

4

1 回答 1

5

这取决于您如何设置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()很容易受到同样的攻击。

于 2013-10-30T08:23:32.443 回答