3

我需要在 C++ 中为CppCMS实现一个简单高效的 XSS 过滤器。我不能使用现有的用 PHP 编写的高质量过滤器,因为它是使用 C++ 的高性能框架。

基本思想是提供一个过滤器,该过滤器具有 HTML 标签的 while 列表和这些标签的选项白名单。例如。典型的 HTML 输入可以由 <b>, <i>, 标记和<a>带有 . 的标记组成href。但简单的实现还不够好,因为即使是允许的简单链接也可能包含 XSS:

<a href="javascript:alert('XSS')">Click On Me</a>

那里还有很多其他的例子。所以我也想为像 href/src 这样的标签创建一个前缀白名单——所以我总是需要检查它是否以(https?|ftp)://

问题:

  • 这些假设是否足以满足大多数目的?这意味着如果我不提供style标签选项并使用前缀白名单检查 src/href 是否可以解决 XSS 问题?是否存在无法通过这种方式解决的问题?
  • 为了编写简单的解析器来清除所有不正确的禁止标记,如 HTML/XHTML 的形式语法是否有很好的参考?<script>
4

3 回答 3

4

你可以看看 Anti Samy 项目,尝试完成同样的事情。虽然它是 Java 和 .NET。

编辑 1,有点额外:

您可能会提出一个非常严格的白名单。它应该结构良好,应该非常紧凑且不太灵活。当您结合灵活性、如此多的标签、属性和不同的浏览器时,通常您最终会遇到 XSS 漏洞。

我不知道您的要求是什么,但我会采用严格而简单的标签支持(仅 b li h1 等),然后基于标签的严格属性支持(例如 src 仅在 href 标签下有效),那么您需要按照您所说的 http|https|ftp 或 style="color|background-color" 等在属性值中进行白名单。

考虑这个:

<x style="express/**/ion:(alert(/bah!/))">

您还需要考虑一些字符白名单或一些 UTF-8 规范化,因为不同的编码可能会导致尴尬的问题。例如属性中的新行、无效的 UTF-8 序列。

于 2009-02-15T20:18:52.443 回答
1

HTML 解析的所有细节都在 HTML 5 中指定。然而,它的实现需要做很多工作,而且你是否会在所有极端情况下准确地解析 HTML 并不重要。在最坏的情况下,你最终会得到不同的 DOM,但无论如何你都必须清理 DOM。

于 2009-04-09T14:30:56.953 回答
1

正如您所提到的,有各种 PHP 实现,但我不知道 C++ 中的任何实现,因为这不是一种通常应用于 Web 开发的语言。总体而言,这将取决于您想要提出的实现的复杂程度。

一个非常严格的白名单可能是“最简单”的方式,但如果你想真正全面,我会考虑将一个已建立的版本转换为 C++,而不是尝试从头开始编写自己的版本。有很多技巧要担心,我认为你最好站在已经经历过这一切的其他人的肩膀上。

我对使用 C++ 进行 Web 开发一无所知,但是将 PHP 转换为它似乎并不是一项特别困难的任务,PHP 并没有任何 C++ 无法复制的神奇功能。我敢肯定会有一些小问题,但总的来说,如果你想走更复杂的路线,那么进行转换肯定比从头开始的完整设计更快。

HTML Purifier似乎是一个强大的 PHP 实现,仍在积极维护中,有一个比较文档,作者讨论了他的方法与其他方法之间的一些差异,可能值得一读。

无论你想出什么,一定要用你链接的所有例子来测试它,并确保它通过了所有这些。祝你好运!

于 2009-04-09T14:33:13.220 回答