用于快速、可配置地清理来自不可信来源的HTML的库。支持Java 8+。
另一种说法可能是:这是一个API,帮助您确保客户端在其个人资料、评论等中提供的HTML中不包含恶意代码,这些代码会被持久化在服务器上。对于Web应用程序而言,“恶意代码”通常指“JavaScript”。大多数情况下,层叠样式表仅在调用JavaScript时才被视为恶意。然而,在很多情况下,“正常”的HTML和CSS也可能被恶意使用。
在1.6.x系列的开发过程中,我们识别并弃用了一些特性和API。所有这些弃用的内容在1.7.0版本中已被移除。这些变更都在ticket中进行了跟踪:https://github.com/nahsra/antisamy/issues/195。每个变更如下所述:
CssHandler有两个构造函数,它们丢弃了LinkedList<URI> embeddedStyleSheets参数。现在两个构造函数都创建一个空的内部LinkedList<URI>,如果需要,可以使用getImportedStylesheetsURIList()方法获取其引用。此功能很少使用,实际上直接调用这些构造函数也很少见,因此此更改不太可能影响大多数AntiSamy用户。在使用时,通常传入一个空列表作为此参数值,并且该列表之后不会再被使用。
删除了CssHandler(Policy, LinkedList<URI>, List<String>, ResourceBundle)签名
CssHandler(Policy, List<String>, ResourceBundle)删除了CssHandler(Policy, LinkedList<URI>, List<String>, String, ResourceBundle)签名
CssHandler(Policy, List<String>, ResourceBundle, String)。注意:此方法最后两个参数的顺序被交换了。放弃了对XHTML的支持。AntiSamy现在只支持HTML。我们认为这是一个很少使用的功能,因此预计不会影响太多AntiSamy用户。
现在AntiSamy策略文件必须进行XML模式验证,且无法禁用。您必须使策略文件符合模式才能与AntiSamy一起使用。
策略指令noopenerAndNoreferrerAnchors现在默认启用。如果禁用,AntiSamy会发出警告,敦促您启用它。
在AntiSamy的升级生命周期中,HTML解析器依赖项发生了变化,可能导致一些输出差异,具体取决于使用情况。如果您过去使用某些版本,并在升级后得到不同的输出,请考虑这一点。
这也适用于将内部HTML表示转换为工具最终文本输出的输出序列化器。
AntiSamy团队认为,支持允许嵌入远程CSS的能力是危险的,因此我们已弃用此功能,并将在未来版本中移除。预计使用此功能的用户非常少,甚至没有。
如果此功能被调用,我们会添加一个日志WARN消息。如果您正在使用此功能,请通过切换到不启用此功能的主要CssScanner构造函数来禁用/移除此功能。
首先,从Maven添加依赖:
<dependency>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
<version>LATEST_VERSION</version>
</dependency>
您的站点使用AntiSamy的场景很可能与预定义的策略文件之一大致相似。每个策略文件代表一种允许用户提供HTML(以及可能的CSS)格式信息的“典型”场景。让我们看看不同的策略文件:
Slashdot是一个技术新闻网站,允许用户以非常有限的HTML标记匿名回复新闻帖子。现在,Slashdot不仅是周围最酷的网站之一,也是遭受过许多成功攻击的网站。Slashdot的规则相当严格:用户只能提交以下HTML标签,并且不能使用CSS:<b>、<u>、<i>、<a>、<blockquote>。
因此,我们构建了一个允许类似功能的策略文件。所有直接作用于字体、颜色或强调的文本格式标签都被允许。
eBay是宇宙中最流行的在线拍卖网站,据我们所知。它是一个公共网站,任何人都可以发布包含丰富HTML内容的列表。eBay作为攻击目标的吸引力并不令人惊讶,它曾遭受过一些复杂的XSS攻击。列表允许包含比Slashdot丰富得多的内容——因此它的攻击面要大得多。
在这个项目诞生时,MySpace是最流行的社交网络网站。用户几乎可以提交他们想要的任何HTML和CSS——只要它不包含JavaScript。MySpace使用单词黑名单来验证用户的HTML,这就是为什么他们遭受了臭名昭著的Samy蠕虫攻击。Samy蠕虫使用了碎片攻击结合一个本应被列入黑名单的单词(eval)——这也是本项目的灵感来源。
我们不知道这个策略文件可能有什么用途。如果您想允许每一个有效的HTML和CSS元素(但不包括JavaScript或明显的CSS相关钓鱼攻击),可以使用此策略文件。即使是MySpace也没有这么疯狂。然而,它可以作为一个很好的参考,因为它包含了每个元素的基本规则,因此您可以在调整其他策略文件时将其作为知识库。
AntiSamy现在包含了slf4j-simple库用于日志记录,但AntiSamy用户可以根据需要导入并使用其他兼容slf4j的日志库。如果他们愿意,也可以排除slf4j-simple。
警告:AntiSamy使用slf4j-simple,在没有任何配置文件的情况下,会以缓冲方式将日志消息输出到标准输出。因此,如果抛出Exception,例如PolicyException,一些或所有日志消息可能会丢失。这可以通过配置slf4j-simple将日志输出到标准错误,或使用其他这样做的slf4j记录器来解决。
您可能希望以默认配置部署AntiSamy,但网站也可能希望有严格的、业务驱动的规则来规定用户允许的内容。决定调整的讨论还应考虑攻击面——攻击面与策略文件相对成正比。
示例策略可以根据每个标签的要求进行调整和测试。可以指定的支持标签动作包括:
filter:移除标签,但保留内容。validate:只要内容通过规则,就保留。remove:移除标签和内容。truncate:移除标签属性以及所有子标签,但保留其文本内容(如果有)。encode:类似于filter,但将标签编码为HTML以保留为原始文本,并且其子节点在层次结构中上移一级。使用AntiSamy很简单。以下是使用策略文件调用AntiSamy的示例:
import org.owasp.validator.html.*;
Policy policy = Policy.getInstance(POLICY_FILE_LOCATION);
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(dirtyInput, policy);
MyUserDAO.storeUserProfile(cr.getCleanHTML()); // 一些自定义函数
有几种创建Policy对象的方法。getInstance()方法可以接受以下任何一种:
String文件名File对象InputStreamAntiSamy#scan()方法传递第二个参数来通过文件名引用Policy文件,如下例所示:AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(dirtyInput, policyFilePath);
最后,策略文件也可以在第二个参数中直接通过File对象引用:
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(dirtyInput, new File(policyFilePath));
CleanResults对象提供了许多有用的信息。
getCleanHTML() - 干净、安全的HTML输出getCleanXMLDocumentFragment() - 干净、安全的XMLDocumentFragment,反映在getCleanHTML()中getErrorMessages() - 一个字符串错误消息列表——如果返回0,并不意味着没有攻击!getNumberOfErrors() - 错误消息的数量——同样,0并不意味着输入是安全的!getScanTime() - 以秒为单位的扫描时间重要说明:关于getErrorMessages()方法存在许多混淆。getErrorMessages()方法(以及getNumberOfErrors())如果返回空列表,并不暗示“这是安全输入?”。您必须始终使用经过清理的输入,并且无法确定传入的输入没有攻击。
对于消毒剂有效性至关重要的序列化和反序列化过程是故意有损的,并会通过多种攻击向量过滤掉攻击。不幸的是,这种策略的代价之一是AntiSamy并不总是能事后知道攻击已被发现。因此,getErrorMessages()和getNumberOfErrors() API的存在是为了帮助用户了解他们善意的输入是否符合系统的要求,而不是帮助开发人员检测是否存在攻击。
其他文档可在该GitHub项目的wiki页面获得:https://github.com/nahsra/antisamy/wiki 以及OWASP AntiSamy项目页面:https://owasp.org/www-project-antisamy/
如果您发现了bug,请在AntiSamy仓库中创建issue:https://github.com/nahsra/antisamy/issues
如果您在AntiSamy中发现了漏洞,首先搜索issues列表(见上方)以查看是否已被报告。如果没有,请直接联系Dave Wichers(dave.wichers at owasp.org)。请不要通过GitHub issues报告漏洞,因为我们希望在实施和部署补丁期间保持用户的安全。如果您希望因发现漏洞而得到感谢,请遵循此流程。
更多详情请参见文件:SECURITY.md。
您可以从源代码轻松构建和测试:
$ git clone https://github.com/nahsra/antisamy
$ cd antisamy
$ mvn package
根据 BSD-3-Clause 许可发布,具体见:LICENSE。