使用owasp-java html消毒程序为每个h2标记添加唯一的属性id



我正在使用owasp-java html清理程序,并尝试将id属性添加到我的html代码中的每个h2标记中,该标记应该在多个页面加载中保持不变,但对于页面上的每个元素都是唯一的(如为id属性定义的(。我尝试对所有元素进行计数以获得索引,并将索引添加到每个h2元素。然而,在java中,我目前无法访问这些数据。然后我使用了UUID.randomUUID((,但是由于它是随机的,所以id不是持久的。

这是我目前拥有的代码:

public PolicyFactory HtmlPolicy() {
return new HtmlPolicyBuilder()
.allowElements("h3", "h4", "h5", "h6", "p", "span", "br", "b", "strong", "i", "em", "u", "hr", "ol", "ul", "li",
"img", "table", "tr", "th", "td", "thead", "tbody", "tfoot", "caption", "colgroup", "col", "blockquote", "figure", "figcaption", "object", "iframe")
.allowElements(
(String elementName, List<String> attrs) -> {
String uniqueID = UUID.randomUUID().toString();
// Add an attribute.
attrs.add("id");                
attrs.add("headline-" + uniqueID);
attrs.add("class");
attrs.add("scrollspy");
// Return elementName to include, null to drop.
return elementName;
}, "h2")
.toFactory();
}

在javascript中,我会如下所示:

$('h2').each(function(index, obj) {
let newObj = $(obj)[0];
$(newObj).attr('id', `headline-2-${index + 1}`);
});

有人知道在这个szenario中每个h2元素上增加一个的方法吗?

我不知道owasp-java-html-sanitizer,但我认为您可以使用额外的变量来存储已使用Id的索引,就像AtomicInteger一样。对于你的代码,它可能看起来像这样:

public PolicyFactory HtmlPolicy() {
AtomicInteger index = new AtomicInteger();
return new HtmlPolicyBuilder()
.allowElements("h3", "h4", "h5", "h6", "p", "span", "br", "b", "strong", "i", "em", "u", "hr", "ol", "ul", "li",
"img", "table", "tr", "th", "td", "thead", "tbody", "tfoot", "caption", "colgroup", "col", "blockquote", "figure", "figcaption", "object", "iframe")
.allowElements(
(String elementName, List<String> attrs) -> {
// Add an attribute.
attrs.add("id");                
attrs.add("headline-" + index.incrementAndGet());
attrs.add("class");
attrs.add("scrollspy");
// Return elementName to include, null to drop.
return elementName;
}, "h2")
.toFactory();
}

@tchudyk提供的解决方案可以正常工作:我不完全确定这一点,因为HtmlPolicyBuilder不是线程安全的,我想库是否每次都会在H2头上保持迭代顺序。

作为一种替代方法,可以考虑使用JSoup,一个JavaHTML解析和操作库。

这个想法是用JSoup操作HTML,以便在用OWASP清理页面之前在页面中包含必要的id属性。

例如,您可以提取h2标签,然后根据需要设置id属性:

String html = "...";
Document doc = Jsoup.parse(html);
Elements h2Tags = doc.select("h2"); // analogous to your example in JQuery
// Iterate, in a deterministic way, over results
int index = 0;
for (Element h2Tag : h2Tags) {
h2Tag.attr("id", "headline-2-" + index++);
}
String transformedHtml = doc.outerHtml();

尽管我认为它不如OWASP强大,但该库也提供了一些净化功能。

相关内容

  • 没有找到相关文章

最新更新