我怎样才能允许:
登录经过净化的 HTML?我用它来清理生成 java 邮件时的 HTML 代码。此代码有一个内联图像内容 ID,如 <img src=\"cid:image\" height=\"70\" width=\"70\" />
。 sanitizer 后,src
属性未包含在清理后的 html 中。
PolicyFactory IMAGES = new HtmlPolicyBuilder().allowUrlProtocols("http", "https")
.allowElements("img")
.allowAttributes("src").matching(Pattern.compile("^cid[:][\\w]+$"))
.onElements("img")
.allowAttributes("border", "height", "width").onElements("img")
.toFactory();
String html = "<img src=\"cid:image\" height=\"70\" width=\"70\" />";
final String sanitized = IMAGES.sanitize(html);
System.out.println(sanitized);
以上代码的输出为:
<img height="70" width="70" />
最佳答案
为什么它不起作用
或者更确切地说,为什么它工作得“太好了”
默认情况下,HtmlPolicyBuilder
不允许在 src
元素中使用 URL 协议(protocol)。这可以防止诸如
<img src="javascript:alert('xss')"/>
这可能会导致在 javascript:
之后执行脚本(在本例中为 alert('xss')
)
还有其他协议(protocol)(在其他元素上)可能会导致类似问题:
即使它不使用javascript
协议(protocol),仍然可以注入(inject)base64编码的XSS注入(inject):
<object src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="/>
或
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">Click me</a>
因此,HtmlPolicyBuilder
假定任何包含冒号的属性值(在某些属性中)都应被视为危险。
如何修复它:
您必须使用allowUrlProtocols
method明确告诉HtmlPolicyBuilder
允许cid“协议(protocol)” :
PolicyFactory IMAGES = new HtmlPolicyBuilder().allowUrlProtocols("http", "https")
.allowElements("img")
.allowUrlProtocols("cid") // Specifically allow "cid"
.allowAttributes("src").matching(Pattern.compile("^cid[:][\\w]+$"))
.onElements("img")
.allowAttributes("border", "height", "width").onElements("img")
.toFactory();
String html = "<img src=\"cid:image\" height=\"70\" width=\"70\" />";
final String sanitized = IMAGES.sanitize(html);
System.out.println(sanitized);
输出:
<img src="cid:image" height="70" width="70" />
关于jakarta-mail - OWASP HTML Sanitizer 允许在 HTML 中使用冒号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856950/