总结
![测验](https://github.com/yesodweb/haskell-xss-sanitize/actions/workflows/tests.yml/badge.svg)
xss-sanitize允许您通过白名单过滤来自不可信源的html。白名单过滤相当全面,包括在样式属性中支持css,但也有以下列举的限制。
清理允许web应用程序安全地使用富文本编辑器,允许在注释中使用html,或以其他方式显示不受信任的html。
如果你信任HTML(你写的),你就不需要使用它。如果你不相信html,你可能也不相信标签是平衡的,应该使用sanitizeBalance函数。
用法
在模块文本中提供了2个功能。HTML格式。消毒XSS
- 清理-过滤html以防止XSS攻击。
- sanitizeBalance-与sanitize相同,但确保没有单独的打开/关闭标记-有助于防止用户的html扰乱页面
细节
这不是逃跑!转义html确实可以防止XSS攻击。字符串(不是HTML)应该进行HTML转义,以正确显示并防止XSS攻击。然而,转义会破坏实际HTML的显示。
此函数用于删除任何不在其白名单中的HTML标记或属性。这听起来可能很挑剔,但大多数HTML都应该保持不变,这样用户就不会注意到这个过程,但我们可以使用安全的HTML。
集成
建议将其集成,以便在应用程序收到不受信任的html数据时自动使用(而不是在显示之前)。以Yesod web框架为例。
限制
小写字母
为了方便起见,所有标记名和属性名都转换为小写。如果您有一个不希望这样做的用例,请告诉我。
平衡-消毒平衡
此函数的目标是防止在(未知)html中放置不平衡标记时,html被破坏。我希望它在实践中能很好地工作,除非您有其他方法,否则不会看到使用它的缺点。然而,此函数根本不能保证有效的html。事实上,平衡的结果很可能仍然是无效的HTML。无法保证浏览器将如何显示无效的HTML,因此无法保证此函数将保护您的HTML不被用户的HTML破坏。其他可能的方法是通过libxml2这样的理解HTML的库来运行HTML,或者首先在页面底部的隐藏iframe或隐藏div中呈现HTML,以便将其隔离,然后使用JavaScript将其插入到所需的页面中。
TagSoup用于解析HTML,它做得很好。然而,TagSoup并没有保留所有空白。TagSoup不区分以下情况:
<a href=“foo”>,<a href=foo><a href><a></a>,<a/>
在第三种情况下,img和br标记将作为单个自闭标记输出。其他自动关闭标签将作为打开和关闭对输出。所以<img>或<img><img>
转换为<img/>
、和<a></a>或<a/>
转换为<a></a>
。计划对TagSoup进行未来更新,以便TagSoug能够呈现与解析时完全相同的标记。
安全
白名单从哪里来?
归根结底,这就是您的安全来源。我希望有缺陷的白名单会起到强大的威慑作用,但这个库力求正确。
这个html5lib的源代码是白名单和我的实现参考的来源。如果您觉得白名单中缺少标签,请检查是否已将其添加到白名单中。
如果有人知道更好的来源或认为某个特定的标记/属性/值可能容易受到攻击,请告诉我。HTML净化器如果您想添加任何内容,则会有一个更宽松、可配置(但安全)的白名单。
代码从哪里来?
原始代码取自John MacFarlane的Pandoc(经许可),但由Greg Weber进行了修改,以提高速度,使用TagSoup重新解析,并使用html5lib的白名单。Michael Snoyman添加了平衡标签功能,并专门发布了css-text以帮助进行css解析。html5lib的sanitizer.py用作参考实现,并且大多数代码看起来应该相同。css解析是不同的:如前所述,我们使用css解析器,而不是像html5lib这样的正则表达式。
样式属性
样式属性现在使用css-text和autoparsec-text依赖项进行解析。然后对属性和关键字的白名单进行检查。空白不被保留。此代码再次从sanitizer.py转换而来,但使用attoparsec而不是regex。如果您不关心剥离css,可以使用此库的早期<0.3版本来避免attoparsec依赖性。
数据属性
数据属性不在白名单上。href和style属性是白名单,但其值也必须通过白名单。这也是数据属性的工作方式。
svg和mathml
mathml白名单已完全实现。有一些对svg样式的支持。svg元素和属性有一个完整的白名单。然而,有些元素没有包括在内,因为它们需要进一步过滤(就像数据属性一样),而这还没有完成。