【问题标题】:How can I safely output content that contains HTML tags?如何安全地输出包含 HTML 标签的内容?
【发布时间】:2013-02-11 16:11:17
【问题描述】:

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

这可能吗?

【问题讨论】:

标签: php html


【解决方案1】:

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

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

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

【讨论】:

  • 所有可用解决方案中最好的。犹豫要不要自己回答这个问题,因为他们似乎已经接受了 HTML,我不想建议更改。但是,如果可以使用另一种标记语言,那就去做吧。
  • 谢谢,在这种情况下,HTML Purifier 似乎是最好的解决方案。由于输入数据的能力将在密码保护区域内,并且仅限于极少数用户,我很高兴他们能够输入 html。
【解决方案2】:

好吧,你可以去掉<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>');

【讨论】:

  • strip_tags 是不够的,因为它不会从元素中删除属性。考虑&lt;a onmouseover="..."&gt;&lt;/a&gt;
  • 您错过了这不是防弹解决方案的哪一部分? :)
  • 你提到你可以“通过允许一些标签来提高安全性”,这不是真的。通过实施允许标签的白名单,您根本不会真正提高安全性。您还提到您可以“避免执行 javascript”,而这种方法无法做到这一点。只是一个旁注:downvote 不是来自我。不要难过。我只是建议改进。
  • +1 因为我发现这个答案帮助我更好地理解了整个主题,而且您确实明确表示这不是一个完美的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2015-08-07
  • 1970-01-01
相关资源
最近更新 更多