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