最佳实践:用户生成的HTML清理

时间:2010-05-05 14:26:22

标签: php javascript html wysiwyg xss

我在iframe上编码WYSIWYG编辑器宽度designMode =“on”。编辑器工作正常,我将代码存储在数据库中。

在输出html之前我需要在服务器端使用php“清理”以避免跨站点脚本和其他可怕的事情。有关于如何做到这一点的某种最佳做法吗?什么标签可能有危险?

更新:错字固定,这就是你所看到的就是你所得到的。没什么新的:)

4 个答案:

答案 0 :(得分:5)

最佳做法是只允许您知道的某些事情并不危险,并删除/逃避所有其他事情。有关此问题的讨论,请参阅文章Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy)(该库适用于Java,但原则适用于任何语言)。

答案 1 :(得分:3)

如果你真的想要允许这样做,你应该使用白名单方法。

最好的方法可能是禁止使用HTML并使用简化的标记格式;如果性能受到关注,您可以预呈现为HTML并将其存储在数据库中。避免这些问题是使用MarkdownTextilereStructuredText等的重要原因之一。

注意:我链接到GitHub-Flavored Markdown(GFM),而非标准Markdown(SM)。 GFM解决了最终用户使用SM时遇到的一些常见问题。

答案 2 :(得分:1)

我最近使用Perl作为服务器端语言查看了同样的问题。

在这样做的同时,我遇到了HTML Purifier,这可能就是你想要的。但很明显,因为它是在PHP而不是Perl,我实际上并没有测试它。

此外,在我的研究中,我得出的结论是,这是一项非常棘手的业务,并考虑使用像Markdown这样的简化标记语言,如Hank Gay建议的那样。

答案 3 :(得分:0)

如果您熟悉ASP .NET,只需执行Server.htmlencode()即可转换特殊字符,例如< > “& g t;” “& l t;”

在php中,您可以使用htmlspecialchars()函数。

编码特殊字符后,可以防止跨站点脚本。