3

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

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

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

4

2 回答 2

2

根据我的理解,我不相信。

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

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

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

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

Word of caution: If you decide to pursue it, know I wouldn't go with the iframe approach. If you don't filter HTML, you also allow forms, and it becomes (IMO) trivial in combination with scripts and CSS to set up extremely convincing phishing, e.g. using tricks such as "this e-mail is password protected, to proceed, please enter your password".

于 2012-11-01T13:20:59.790 回答
0

一种可能的解决方案(也是 SO 使用的解决方案!)是只允许某些类型的标签。 <p>并且<br />很好,但<script>马上就出来了。

于 2012-11-01T01:10:48.557 回答