我的UI中有一个HTML textarea(用于基于Java的Web应用程序),用户可以在其中输入任何值。保存后,它将显示在浏览器中的textarea(已禁用)中。
如果用户在textarea中输入任何脚本作为自由文本,它是否会作为脚本执行(即使该值显示在textarea中,而不是作为标签/文本显示)?
答案 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>