这是一个完全合理的方法。对于典型的应用,这将是完全足够的。
白名单原始HTML最棘手的部分是style
属性和embed
/object
。为什么有人可能希望将CSS样式放入不受信任的格式化文本块或嵌入式YouTube视频中,这是合法的原因。这个问题最常见于提要。您不能相信供稿条目中包含的任意文本块,但您不想剥离(例如突出显示CSS或Flash视频的语法),因为这会从根本上改变内容并可能使读者感到困惑。由于CSS可能包含诸如IE中的行为等危险事物,因此如果您决定允许style
属性保留,则可能必须解析CSS。并且使用embed
/object
您可能需要将主机名列入白名单。
附录:
在最坏的情况下,在视线HTML逃脱一切都可以导致非常差的用户体验。使用诸如HTML5解析器之类的东西来与白名单一起浏览DOM会更好。就如何向用户展示已清理过的输出而言,这非常灵活。你甚至可以做这样的事情:
<div class="sanitized">
<div class="notice">
This was sanitized for security reasons.
</div>
<div class="raw"><pre>
<script>alert("XSS!");</script>
</pre></div>
</div>
然后隐藏.raw
东西与CSS,并使用jQuery一个单击处理程序绑定到.sanitized
div
即切换.raw
之间.notice
:
CSS:
.raw {
display: none;
}
的jQuery:
$('.sanitized').click(function() {
$(this).find('.notice').toggle();
$(this).find('.sanitized').toggle();
});
我还没有允许使用css风格作为内容,但我想很快就允许使用视频。认为这是一个问题。 – Aaron 2009-10-22 18:02:58
是的。在大多数情况下,我建议去Facebook路线。将视频视为附件,而不是将它们视为内容的一部分。 – 2009-10-22 18:43:30
哦极好的想法! – Aaron 2009-10-30 18:05:49