基于白名单的(X)HTML XSS过滤器编写

3

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

基本思路是提供一个白名单HTML标签和这些标签的白名单选项的过滤器。例如,典型的HTML输入可以包括<b><i>标签和带有href属性的<a>标签。但是,直接实现是不够好的,因为即使是允许的简单链接也可能包含XSS攻击:

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

有许多其他例子可以在这里找到。因此,我也考虑了一种可能性,即创建标签的前缀白名单,例如href/src -- 因此,我总是需要检查它是否以(https?|ftp)://开头。
问题:
1.这些假设是否足够适用于大多数情况?是否意味着如果我不给出style标签的选项,并使用前缀的白名单来检查src/href,则可以解决XSS问题?是否有无法通过此方式修复的问题?
2.是否有HTML/XHTML形式语法的良好参考文献,以便编写简单的解析器,以清除所有不正确或禁止的标签,例如<script>
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序列等。

1
所有HTML解析的细节都在HTML 5中指定。然而,它的实现需要相当大量的工作,并且不管你是否解析了HTML的每一个细节情况都没有关系。最坏的情况是您会得到不同的DOM,但无论如何都必须对DOM进行消毒。

1

正如您所提到的,有许多 PHP 的实现方式,但我不知道是否有 C++ 的实现,因为这通常不是用于网站开发的语言。总体而言,这将取决于您想要设计多复杂的实现。

一个非常严格的白名单可能是最简单的方法,但如果您想要非常全面,我建议研究一下如何将其中一个已经成熟的版本转换为 C++,而不是从头开始编写。有太多需要考虑的技巧,我认为站在已经经历所有这些的其他人的肩膀上更好。

我不知道如何在网站开发中使用 C++,但将 PHP 转换为 C++ 似乎并不是一项特别困难的任务,PHP 并没有什么魔法功能,C++ 也能够复制。当然会遇到一些小问题,但总体来说,如果您选择更复杂的路线,进行转换肯定比从头开始设计快得多。

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

无论你想到什么,一定要用你链接的所有示例进行测试,并确保它通过了所有测试。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接