当脚本在HTML textarea中显示时,是否可以进行XSS攻击?

时间:2013-10-30 05:47:47

标签: java security web-applications browser xss

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

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

1 个答案:

答案 0 :(得分:4)

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

我创建了JSFiddle to demonstrate种各种方法来更改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是安全的:It doesn't execute scripts inserted in this way

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

String unfilteredInput = "</textarea><script>alert(\"Danger!\");</script>";

out.write("<textarea>");
out.write(content);
out.write("</textarea>");

将执行脚本。

注意:我也尝试演示document.write(),但JSFiddle中不允许这样做。我很确定document.write()容易遭受同样的攻击。<​​/ p>