2

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

这可能吗?

4

2 回答 2

1

您想要的是选择性过滤或清理。换句话说,您希望允许一些HTML,但不允许其他可能是恶意的标签。这是一项非常棘手的工作,特别是因为 HTML 语法非常复杂,而且过于简单的清理尝试很容易出错,从而允许通过格式错误的 HTML 注入标签。

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

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

于 2013-02-11T16:22:19.297 回答
-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>');
于 2013-02-11T16:19:11.150 回答