Skip to content

Commit 2901ef0

Browse files
cswaremikesamuel
andauthored
Fix repeatedly adding rel values (#307)
* Don't allow duplicates in rel attribute for links Signed-off-by: Sven Strickroth <email@cs-ware.de> * Use lower case link rel attribute words --------- Signed-off-by: Sven Strickroth <email@cs-ware.de> Co-authored-by: Mike Samuel <mikesamuel@gmail.com>
1 parent 58fac00 commit 2901ef0

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,12 +1045,11 @@ 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);
1052-
present.add(rel);
1053-
sb.append(rel).append(' ');
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)) {
1051+
present.add(lowerCaseRel);
1052+
sb.append(lowerCaseRel).append(' ');
10541053
}
10551054
}
10561055
left = i + 1;

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

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

927+
@Test
928+
public static final void testRelLinksWithDuplicateRels() {
929+
PolicyFactory pf = new HtmlPolicyBuilder()
930+
.allowElements("a")
931+
.allowAttributes("href").onElements("a")
932+
.allowAttributes("rel").onElements("a")
933+
.allowAttributes("target").onElements("a")
934+
.allowStandardUrlProtocols()
935+
.toFactory();
936+
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>"));
937+
}
938+
939+
@Test
940+
public static final void testRelLinksWithDuplicateRelsRequired() {
941+
PolicyFactory pf = new HtmlPolicyBuilder()
942+
.allowElements("a")
943+
.allowAttributes("href").onElements("a")
944+
.allowAttributes("rel").onElements("a")
945+
.allowAttributes("target").onElements("a")
946+
.allowStandardUrlProtocols()
947+
.requireRelsOnLinks("noreferrer")
948+
.toFactory();
949+
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>"));
950+
}
951+
927952
@Test
928953
public static final void testFailFastOnSpaceSeparatedStrings() {
929954
boolean failed;

0 commit comments

Comments
 (0)