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

Ste*_*ier 4 html java owasp

我想允许:

<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 并且如果找到允许它通过。但这并没有发生......

Gre*_*Gum 5

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

var sanitizer = new HtmlSanitizer();
sanitizer.AllowedSchemes.Add("data");
Run Code Online (Sandbox Code Playgroud)


Ste*_*ier 2

问题是我有:

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