2009-10-22 40 views
10

在我的web应用程序中,我允许将用户生成的内容发布为类似于Stackoverflow的公共消费类型。处理用户生成的html内容将被公众查看的最佳方式是什么?

处理此问题的最佳做法是什么?

我处理用户生成的内容当前步骤是:

  1. 我用MarkItUp允许用户 一个简单的方法来格式化它们的HTML。

  2. 在用户已经通过HTML Sanitizer提交thier 改变我运行它(滚动到 bottem)使用白名单 方法

  3. 如果消毒过程有 删除任何用户创建的内容我 不保存内容。然后我 回到那里修改了 警告信息的内容,“一些不法 内容,其中检测并移除 双重检查你的工作和 再试一次标签。”

  4. 如果内容通过 消毒处理干净,我救 原始HTML内容到 数据库。

  5. 当渲染到客户端时,我只需 将原始html从db中传递到 页面。

回答

2

这是一个完全合理的方法。对于典型的应用,这将是完全足够的。

白名单原始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> 
    &lt;script&gt;alert("XSS!");&lt;/script&gt; 
    </pre></div> 
</div> 

然后隐藏.raw东西与CSS,并使用jQuery一个单击处理程序绑定到.sanitizeddiv即切换.raw之间.notice

CSS:

.raw { 
    display: none; 
} 

的jQuery:

$('.sanitized').click(function() { 
    $(this).find('.notice').toggle(); 
    $(this).find('.sanitized').toggle(); 
}); 
+0

我还没有允许使用css风格作为内容,但我想很快就允许使用视频。认为这是一个问题。 – Aaron 2009-10-22 18:02:58

+0

是的。在大多数情况下,我建议去Facebook路线。将视频视为附件,而不是将它们视为内容的一部分。 – 2009-10-22 18:43:30

+0

哦极好的想法! – Aaron 2009-10-30 18:05:49

1

白名单是一个很好的举措。任何黑名单解决方案都倾向于通过超过它应该,因为你不能想到的一切。我已经看到了一些使用黑名单的尝试(例如The Code Project),如果他们能够捕捉所有东西,通常它们还会引起其他问题,例如替换代码中的字符,以便在不手动恢复的情况下不能使用它。

最安全的方法是:

  1. HTML编码的所有文本。

  2. 匹配一组允许的标记和属性和解码的。

使用正则表达式,你甚至可以要求每一个打开的标签具有一个结束标记,使未封闭的标签就不会搞砸的页面。

你应该能够做到这一点的类似的代码十行,让你链接到代码似乎过于复杂。

+0

“HTML编码所有文本”是什么意思?谢谢! – JDelage 2012-02-07 23:10:49

相关问题