【问题标题】:Best Practice: User generated HTML cleaning最佳实践:用户生成的 HTML 清理
【发布时间】:2010-05-05 14:26:22
【问题描述】:

我正在 iframe 上编写 WYSIWYG 编辑器宽度 designMode="on"。编辑器工作正常,我将代码按原样存储在数据库中。

在输出 html 之前,我需要在服务器端使用 php“清理”以避免跨站点脚本和其他可怕的事情。关于如何做到这一点,是否有某种最佳实践?哪些标签可能是危险的?

更新:错字已修复,所见即所得。没什么新鲜的:)

【问题讨论】:

  • 如果你决定自己实现这个,你最好看看ha.ckers.org/xss.html - 各种浏览器中的已知攻击列表。
  • 好问题 - 我想知道 stackoverflow 如何保护自己...

标签: php javascript html wysiwyg xss


【解决方案1】:

最佳做法是只允许您知道不危险的某些事情,并删除/逃避所有其他事情。有关此问题的讨论,请参阅论文 Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy)(该库适用于 Java,但原则适用于任何语言)。

【讨论】:

  • 我是这样开始的,但是由于所有浏览器都以不同的方式实现这些东西,我会得到很多我需要允许的相同东西的标签。例如,粗体文本至少以 3 种不同的方式完成。所以这将是一组巨大的正则表达式。也可以在编辑器中粘贴您想要的任何格式的 html,例如来自 html 邮件或其他内容。这在编辑器中看起来不错,但在逃生后就不起作用了。
  • 这就是为什么 AntiSamy 已经附带了一些示例集。可能还有一个 PHP 库(或者您可以创建一个?)您将永远以相反的方式实现它(通过黑名单):以前尝试过的每个人都失败了 - 这根本不可能- 会有你没有涵盖的东西(这对于列入黑名单是致命的,但在列入白名单时并不重要)。理想情况下,如果您可以避免使用 HTML,请按照 Hank 的建议使用 Markdown 等!
  • @Martin 你真的不应该为此使用正则表达式。 this answer 获得(净)3000 次投票是有原因的。
  • 好的,我现在确信我应该将其列入白名单而不是列入黑名单。 @Hank Gay:但我并不会真正解析 html,我只是将
【解决方案2】:

如果你真的想允许这样做,你应该使用白名单方法。

最好的方法可能是禁止使用 HTML 并改用简化的标记格式;如果性能是一个问题,您可以预渲染为 HTML 并将其存储在数据库中。避免此类问题是使用MarkdownTextilereStructuredText 等的重要原因之一。

注意:我链接到 GitHub-Flavored Markdown (GFM),而不是标准 Markdown (SM)。 GFM 解决了最终用户在使用 SM 时遇到的一些常见问题。

【讨论】:

    【解决方案3】:

    我最近用 Perl 作为服务器端语言研究了同样的问题。

    这样做时我遇到了HTML Purifier,这可能是您想要的。但很明显,因为它是用 PHP 而不是 Perl,所以我实际上并没有对其进行测试。

    此外,在我的研究中,我得出的结论是,这是一项非常棘手的业务,并考虑是否可以使用如 Hank Gay 建议的简化标记语言,如 Markdown。

    【讨论】:

      【解决方案4】:

      如果您熟悉 ASP .NET,只需执行 Server.htmlencode() 即可将 等特殊字符转换为“& g t;” “<”

      在 php 中,您可以使用 htmlspecialchars() 函数。

      一旦对特殊字符进行编码,就可以防止跨站脚本。

      【讨论】:

      • 但这会禁用 html,我想允许 html 但删除 iframe 和脚本等危险标签。
      • 然后使用专门为该目的设计的标记,如 bbcode 或 wikicode 以及合适的编辑器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2013-01-23
      • 2020-04-16
      • 2021-01-14
      相关资源
      最近更新 更多