Skip to content

Commit e97ae8c

Browse files
committed
Don't allow duplicates in rel attribute for links
Signed-off-by: Sven Strickroth <email@cs-ware.de>
1 parent e8aa0f1 commit e97ae8c

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

src/main/java/org/owasp/html/HtmlPolicyBuilder.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,10 +1045,9 @@ public String apply(String elementName, List<String> attrs) {
10451045
for (int i = 0; i <= n; ++i) {
10461046
if (i == n || Strings.isHtmlSpace(rels.charAt(i))) {
10471047
if (left < i) {
1048-
if (skip.isEmpty()
1049-
|| !skip.contains(
1050-
Strings.toLowerCase(rels.substring(left, i)))) {
1051-
String rel = rels.substring(left, i);
1048+
final String rel = rels.substring(left, i);
1049+
final String lowerCaseRel = Strings.toLowerCase(rel);
1050+
if ((skip.isEmpty() || !skip.contains(lowerCaseRel)) && !present.contains(lowerCaseRel)) {
10521051
present.add(rel);
10531052
sb.append(rel).append(' ');
10541053
}

src/test/java/org/owasp/html/HtmlPolicyBuilderTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,31 @@ public final void testRelLinksWhenRelIsPartOfData() {
874874
assertEquals(toSanitize, pf.sanitize(toSanitize));
875875
}
876876

877+
@Test
878+
public static final void testRelLinksWithDuplicateRels() {
879+
PolicyFactory pf = new HtmlPolicyBuilder()
880+
.allowElements("a")
881+
.allowAttributes("href").onElements("a")
882+
.allowAttributes("rel").onElements("a")
883+
.allowAttributes("target").onElements("a")
884+
.allowStandardUrlProtocols()
885+
.toFactory();
886+
assertEquals("<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://google.com\">test</a>", pf.sanitize("<a target=\"_blank\" rel=\"noopener noreferrer noreferrer\" href=\"https://google.com\">test</a>"));
887+
}
888+
889+
@Test
890+
public static final void testRelLinksWithDuplicateRelsRequired() {
891+
PolicyFactory pf = new HtmlPolicyBuilder()
892+
.allowElements("a")
893+
.allowAttributes("href").onElements("a")
894+
.allowAttributes("rel").onElements("a")
895+
.allowAttributes("target").onElements("a")
896+
.allowStandardUrlProtocols()
897+
.requireRelsOnLinks("noreferrer")
898+
.toFactory();
899+
assertEquals("<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://google.com\">test</a>", pf.sanitize("<a target=\"_blank\" rel=\"noopener noreferrer noreferrer\" href=\"https://google.com\">test</a>"));
900+
}
901+
877902
@Test
878903
public static final void testFailFastOnSpaceSeparatedStrings() {
879904
boolean failed;

0 commit comments

Comments
 (0)