【问题标题】:Displaying foreign HTML safely安全地显示外来 HTML
【发布时间】:2012-11-01 01:06:12
【问题描述】:

我有一个应用程序需要安全地显示外部 HTML 数据(例如 HTML 编码的电子邮件文本,但不仅如此) - 即删除 XSS 尝试和其他讨厌的东西。但仍然能够显示 HTML 应有的样子。到目前为止考虑的解决方案并不理想:

  1. 使用 HTMLPurifier 之类的工具清理 HTML。工作正常,但一旦电子邮件大小超过 100K,它就会变得非常慢 - 每封电子邮件数十秒。我怀疑任何足够安全的解析器在 PHP 中的速度都会很慢——有些电子邮件的 HTML 非常糟糕,我见过一些为一页文本生成 150K HTML 的电子邮件。
  2. 在 iframe 中显示 HTML - 这里的问题是 iframe 需要位于另一个来源才能免受 XSS AFAIK 的影响,这将需要同一应用程序使用不同的域。设置具有两个域的应用程序需要更多的工作,并且在某些设置中可能非常困难(例如只提供一个域名的主机)。

还有其他解决方案可以达到这个效果吗?

【问题讨论】:

    标签: php html html-parsing htmlpurifier


    【解决方案1】:

    据我了解,我不这么认为。

    问题在于,只有理解了 HTML 标签的结构,才能安全地删除 HTML 标签,而“理解它的结构”正是解析的内容。即使你找到了一种不同的方法来分析 HTML 的结构并且不调用它解析,这就是你正在做的事情,它必然是某种形式的缓慢(或不安全)。

    你可以做的是使用一些初步过滤器(例如strip_tags,这通常是一个很好的初步'(如果肯定没有其他的话))来减少解析器的工作量,但这是否可行取决于您的标签白名单的大小 - 一个小的白名单可能会产生更好的基准测试结果,因为一大块 HTML 会在解析器到达之前被strip_tags 过滤掉。

    此外,不同的解析器以不同的方式工作,而您经常处理的那种 HTML 可能最适合一种解析器而不是另一种 - HTML Purifier 本身,甚至是has different parsers at its disposal,您可以在它们之间切换以查看结果是否为您提供更好的基准(尽管我怀疑差异可以忽略不计)。

    不过,这种杂耍是否适用于您的用例可能需要您自己进行基准测试。

    注意事项:如果您决定采用它,请知道我不会采用 iframe 方法。如果您不过滤 HTML,您也可以使用表单,并且与脚本和 CSS 结合使用(IMO)变得微不足道,以设置极具说服力的网络钓鱼,例如使用诸如“此电子邮件受密码保护,要继续,请输入您的密码”之类的技巧。

    【讨论】:

      【解决方案2】:

      一种可能的解决方案 (and the one that SO uses!) 是只允许某些类型的标签。 <p><br /> 没问题,但 <script> 是正确的。

      【讨论】:

      • 对。但是你怎么知道哪些标签存在哪些不存在呢?您需要解析所有内容 - 讨厌的东西可能在 CSS、标签属性 () 等中。所以这是第一种方法 - HTMLPurifier 等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2016-03-14
      相关资源
      最近更新 更多