如何允许:
签署已清理的HTML?我用它来生成java邮件时清理HTML代码。此代码的内嵌图像内容ID类似于<img src=\"cid:image\" height=\"70\" width=\"70\" />
。清理后,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" />
答案 0 :(得分:8)
默认情况下,HtmlPolicyBuilder
不允许src
元素中的网址协议。这可以防止注射,例如
<img src="javascript:alert('xss')"/>
可能导致在javascript:
之后执行脚本(在本例中为alert('xss')
)
还有其他协议(在其他元素上)会导致类似的问题:
即使它没有使用javascript
协议,它仍然可以注入base64编码的XSS注入:
<object src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="/>
或
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">Click me</a>
&#13;
因此,HtmlPolicyBuilder
假定包含冒号(在某些属性中)的任何属性值应视为危险。
您必须使用allowUrlProtocols
method明确告诉HtmlPolicyBuilder
允许 cid &#34;协议&#34;:
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" />