如何在使用OWASP Java HTML Sanitizer清理html时允许嵌入的图像

我想允许:

 

我看到有关于如何执行此操作的文档,但我不明白如何实现它。 我试图添加模式

 .allowUrlProtocols("data") .allowAttributes("src").matching(Pattern.compile("$data:image.*")).onElements("img") 

但那没用。 我理解模式必须是正则表达式,但我不确定我是否理解它是如何连接起来的。 我知道它正在尝试寻找img标签,然后查看src属性。 我的理解是,它应该寻找字符串数据:图像和if发现允许它通过。 但那并没有发生……

问题是我有:

 private static final PolicyFactory POLICY_DEFINITION = new HtmlPolicyBuilder() .allowUrlProtocols("data") .allowAttributes("src").matching(ONSITE_OR_OFFSITE_URL).onElements("img") .allowAttributes("src").matching(Pattern.compile("^.*data:image/.*$")).onElements("img") .toFactory(); 

这引起了一个问题,我假设allowAttribute将两者结合起来。 相反,你需要做的是OR模式匹配(对于你想要匹配的任何模式),如:

 Pattern EMBEDDED_IMAGE = Pattern.compile("^.*data:image/.*$") ONSITE_OR_OFFSITE_URL_OR_EMBEDDED_IMAGE = matchesEither(ONSITE_URL, OFFSITE_URL, EMBEDDED_IMAGE); private static final PolicyFactory POLICY_DEFINITION = new HtmlPolicyBuilder() .allowUrlProtocols("data") .allowAttributes("src").matching(ONSITE_OR_OFFSITE_URL_OR_EMBEDDED_IMAGE).onElements("img") .toFactory(); 

此代码假定您使用的是EbayPolicyExample

如果你到了这里(就像我一样)但是你正在使用HTMLSanitizer for C#,那么答案是:

 var sanitizer = new HtmlSanitizer(); sanitizer.AllowedSchemes.Add("data");