我在iframe上编码WYSIWYG编辑器宽度designMode =“on”。编辑器工作正常,我将代码存储在数据库中。
在输出html之前我需要在服务器端使用php“清理”以避免跨站点脚本和其他可怕的事情。有关于如何做到这一点的某种最佳做法吗?什么标签可能有危险?
更新:错字固定,这就是你所看到的就是你所得到的。没什么新的:)
答案 0 :(得分:5)
最佳做法是只允许您知道的某些事情并不危险,并删除/逃避所有其他事情。有关此问题的讨论,请参阅文章Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy)(该库适用于Java,但原则适用于任何语言)。
答案 1 :(得分:3)
如果你真的想要允许这样做,你应该使用白名单方法。
最好的方法可能是禁止使用HTML并使用简化的标记格式;如果性能受到关注,您可以预呈现为HTML并将其存储在数据库中。避免这些问题是使用Markdown,Textile,reStructuredText等的重要原因之一。
注意:我链接到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()函数。
编码特殊字符后,可以防止跨站点脚本。