Skip to content
Snippets Groups Projects
Commit 8cd01422 authored by srosse's avatar srosse
Browse files

OO-4024: in case of BATIK-1149 clean rgb values and retry with antisamy

parent 0c1fade6
No related branches found
No related tags found
No related merge requests found
...@@ -19,11 +19,14 @@ ...@@ -19,11 +19,14 @@
*/ */
package org.olat.core.util.filter.impl; package org.olat.core.util.filter.impl;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import org.cyberneko.html.parsers.SAXParser;
import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.OLATRuntimeException;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
...@@ -34,6 +37,10 @@ import org.owasp.validator.html.CleanResults; ...@@ -34,6 +37,10 @@ import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy; import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException; import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException; import org.owasp.validator.html.ScanException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/** /**
* Description:<br> * Description:<br>
...@@ -137,7 +144,7 @@ public class OWASPAntiSamyXSSFilter implements Filter { ...@@ -137,7 +144,7 @@ public class OWASPAntiSamyXSSFilter implements Filter {
ore.printStackTrace(printWriter); ore.printStackTrace(printWriter);
} }
private String getCleanHTML(String original) { private String getCleanHTML(String original) {
Policy policy; Policy policy;
if(variant == Variant.wiki) { if(variant == Variant.wiki) {
if(entityEncodeIntlChars) { if(entityEncodeIntlChars) {
...@@ -167,7 +174,10 @@ public class OWASPAntiSamyXSSFilter implements Filter { ...@@ -167,7 +174,10 @@ public class OWASPAntiSamyXSSFilter implements Filter {
} catch (PolicyException e) { } catch (PolicyException e) {
log.error("XSS Filter policy error", e); log.error("XSS Filter policy error", e);
printOriginStackTrace(); printOriginStackTrace();
} } catch (IllegalStateException e) {
//Bug in Batik with rgb values in percent: rgb(100%,20%,0%)
getCleanHTMLFromBatikBug(original, policy);
}
String output; String output;
try { try {
output = cr.getCleanHTML(); output = cr.getCleanHTML();
...@@ -182,6 +192,37 @@ public class OWASPAntiSamyXSSFilter implements Filter { ...@@ -182,6 +192,37 @@ public class OWASPAntiSamyXSSFilter implements Filter {
return output; return output;
} }
private void getCleanHTMLFromBatikBug(String original, Policy policy) {
cr = null;
try {
String rgbCleanedOriginal = cleanHtml(original);
AntiSamy as = new AntiSamy();
cr = as.scan(rgbCleanedOriginal, policy);
} catch (ScanException e) {
log.error("XSS Filter scan error", e);
printOriginStackTrace();
} catch (PolicyException e) {
log.error("XSS Filter policy error", e);
printOriginStackTrace();
} catch (IllegalStateException e) {
log.error("XSS Filter policy dramatic Batik error", e);
printOriginStackTrace();
}
}
private String cleanHtml(String original) {
try {
HTMLCleanerHandler handler = new HTMLCleanerHandler();
SAXParser parser = new SAXParser();
parser.setContentHandler(handler);
parser.parse(new InputSource(new StringReader(original)));
return handler.toString();
} catch (SAXException | IOException e) {
log.error("", e);
return "";
}
}
public int getNumOfErrors() { public int getNumOfErrors() {
if (cr != null) { if (cr != null) {
return cr.getNumberOfErrors(); return cr.getNumberOfErrors();
...@@ -191,7 +232,7 @@ public class OWASPAntiSamyXSSFilter implements Filter { ...@@ -191,7 +232,7 @@ public class OWASPAntiSamyXSSFilter implements Filter {
/** /**
* get Errors/Messages from filter. * get Errors/Messages from filter.
* This have not to be "errors", its what has been filtered and gets reported. * This have not to be "errors", its whatR has been filtered and gets reported.
* @return * @return
*/ */
public String getOrPrintErrorMessages(){ public String getOrPrintErrorMessages(){
...@@ -210,4 +251,63 @@ public class OWASPAntiSamyXSSFilter implements Filter { ...@@ -210,4 +251,63 @@ public class OWASPAntiSamyXSSFilter implements Filter {
wiki wiki
} }
/**
* The handler will remove style attributes if it detects a RGB value
* to prevent: https://issues.apache.org/jira/browse/BATIK-1149<br>
* This is a bug in Batik which doesn't understand rgb values in percent.
*
* Initial date: 16 avr. 2019<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
private static class HTMLCleanerHandler extends DefaultHandler {
private final StringBuilder output = new StringBuilder(4096);
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) {
output.append("<").append(localName);
int numOfAttributes = attributes.getLength();
for(int i=0; i<numOfAttributes; i++) {
String attrName = attributes.getLocalName(i);
String attrValue = attributes.getValue(i);
if(attrValue.contains("rgb")) {
continue;
}
output.append(' ').append(attrName).append("=");
boolean useSingle = attrValue.indexOf('"') >= 0;
if(useSingle) {
output.append('\'');
} else {
output.append('"');
}
output.append(attrValue);
if(useSingle) {
output.append('\'');
} else {
output.append('"');
}
}
output.append(">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(output != null) {
output.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) {
output.append("</").append(localName).append(">");
}
@Override
public String toString() {
return output.toString();
}
}
} }
...@@ -235,6 +235,16 @@ public class XSSFilterTest { ...@@ -235,6 +235,16 @@ public class XSSFilterTest {
// t("<span style=\"font-family: serif, arial;\">preformated</span>", "<span style=\"font-family: courier new , courier;\">preformated</span>"); // t("<span style=\"font-family: serif, arial;\">preformated</span>", "<span style=\"font-family: courier new , courier;\">preformated</span>");
t("<span class=\"schoen\">irgendwas</span>", "<span class=\"schoen\">irgendwas</span>"); t("<span class=\"schoen\">irgendwas</span>", "<span class=\"schoen\">irgendwas</span>");
} }
/**
* This checks a bug in Batik
*/
@Test
public void test_style_rgb(){
t("<p style=\"background-color: rgb(0%,0,0);\">background</p>", "<p>background</p>");
t("<p style=\"background-color: rgba(100%,0,0);\">background</p>", "<p style=\"\">background</p>");
t("<p style=\"background-color: rgb(100,50,50);\">background</p>", "<p style=\"background-color: rgb(100,50,50);\">background</p>");
}
@Test @Test
public void test_tiny_lists(){ public void test_tiny_lists(){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment