我想允许:
<img src="data:image/jpg;base64,..."/>
Run Code Online (Sandbox Code Playgroud)
我看到有关于如何执行此操作的文档,但我不明白如何实现它。我试图添加模式
.allowUrlProtocols("data")
.allowAttributes("src").matching(Pattern.compile("$data:image.*")).onElements("img")
Run Code Online (Sandbox Code Playgroud)
但这没有用。我知道模式必须是一个正则表达式,但我不确定我是否理解它是如何联系起来的。我知道它正在尝试查找 img 标签,然后查看 src 属性。我的理解是它应该然后查找字符串 data:image 并且如果找到允许它通过。但这并没有发生......
如果你到了这里(就像我一样)但是你使用的是 C# 的 HTMLSanitizer,那么答案是:
var sanitizer = new HtmlSanitizer();
sanitizer.AllowedSchemes.Add("data");
Run Code Online (Sandbox Code Playgroud)
问题是我有:
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();
Run Code Online (Sandbox Code Playgroud)
这导致了一个问题,因为我认为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();
Run Code Online (Sandbox Code Playgroud)
此代码假设您使用的是EbayPolicyExample