如何安全地输出包含HTML标记的内容?

时间:2013-02-11 16:11:17

标签: php html

我有一个博客系统,用户必须将内容输入到html文本区域,包括html标签,例如<p>。它存储在数据库中。如果此输入随后使用php回显到网页,我如何转义输出以防止XSS,但保留html标记的含义,以便博客文章格式正确?如果我使用htmlentities($blog_content),它会将html标签打印到页面,因此您会看到<p>hello this is a blog</p>

这可能吗?

2 个答案:

答案 0 :(得分:1)

您想要的是选择性过滤或消毒。换句话说,您希望允许某些 HTML,但不允许其他可能是恶意的标记。这是非常棘手的业务,特别是因为HTML语法非常复杂,过于简单的清理尝试容易出错,无论如何都会通过格式错误的HTML注入标记。

如果可能,您应该远离让用户提交HTML。使用特殊的标记语言,如Wiki标记,Markdown,BBcodes或类似的。

如果您确定自己在做什么,那么您应该选择一个经过良好测试的强大库来提供这样的清理功能。 HTML Purifier是我所知道的唯一符合此描述的人。

答案 1 :(得分:-1)

好吧,您可以使用<script> 剥离strip_tags()代码,这不是一个防弹解决方案,但您可以通过仅允许某些代码来提高安全性(基本上是粗体) ,斜体,链接等等......)

然后,您可以轻松打印内容并避免执行javascript。

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p>, <a> and some formatting
echo strip_tags($text, '<p><a><i><em><b><strong>');