diff options
author | Thomas Lenz <thomas.lenz@egiz.gv.at> | 2017-06-23 06:50:14 +0200 |
---|---|---|
committer | Thomas Lenz <thomas.lenz@egiz.gv.at> | 2017-06-23 06:50:14 +0200 |
commit | 0603c0fbdfe028113431c65590b6e7e28929f6f6 (patch) | |
tree | ca64698b31b478abe7fb5cde97398646f4105699 /utils/src/main/java/at/gv/egiz/dom | |
parent | d840a372f84518c4026efd3d463cfcffac930e46 (diff) | |
download | mocca-0603c0fbdfe028113431c65590b6e7e28929f6f6.tar.gz mocca-0603c0fbdfe028113431c65590b6e7e28929f6f6.tar.bz2 mocca-0603c0fbdfe028113431c65590b6e7e28929f6f6.zip |
some small refactoring and code documentation
Diffstat (limited to 'utils/src/main/java/at/gv/egiz/dom')
-rw-r--r-- | utils/src/main/java/at/gv/egiz/dom/DOMUtils.java | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/utils/src/main/java/at/gv/egiz/dom/DOMUtils.java b/utils/src/main/java/at/gv/egiz/dom/DOMUtils.java index eae8f05e..2054021a 100644 --- a/utils/src/main/java/at/gv/egiz/dom/DOMUtils.java +++ b/utils/src/main/java/at/gv/egiz/dom/DOMUtils.java @@ -33,7 +33,8 @@ import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLStreamException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; @@ -47,7 +48,8 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.Text;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
-import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.DOMImplementationLS; +import org.xml.sax.SAXException;
public final class DOMUtils {
@@ -160,6 +162,76 @@ public final class DOMUtils { base64OutputStream.close();
return doc.createTextNode(outputStream.toString("ASCII"));
- }
+ } + + /** + * Set XML parser features to {@link DocumentBuilderFactory} to prevent XXE, XEE and SSRF attacks + * <br> + * <br> + * These features are set by this method: + * <ul> + * <li>http://xml.org/sax/features/external-general-entities --> false</li> + * <li>http://xml.org/sax/features/external-parameter-entities --> false</li> + * <li>http://apache.org/xml/features/nonvalidating/load-external-dtd --> false</li> + * <li>http://apache.org/xml/features/disallow-doctype-decl --> true</li> + * </ul> + * + * + * @param dbf {@link DocumentBuilderFactory} on which the features should be registered + */ + public static void setXMLParserFlagsAgainstXXEAndSSRFAttacks(DocumentBuilderFactory dbf) { + try { + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + + } catch (ParserConfigurationException e) { + log.error("Can NOT set Xerces parser security features. -> XML parsing is possible insecure!!!! ", e); + + } + + } + + /** + * Parse an {@link InputStream} that contains a XML document into a {@link Document} + * This method set all features to prevent XXE, XEE and SSRF attacks + * + * These features are set by this method: + * <ul> + * <li>http://xml.org/sax/features/external-general-entities --> false</li> + * <li>http://xml.org/sax/features/external-parameter-entities --> false</li> + * <li>http://apache.org/xml/features/nonvalidating/load-external-dtd --> false</li> + * <li>http://apache.org/xml/features/disallow-doctype-decl --> true</li> + * </ul> + * + * @param is {@link InputStream} that contains a serialized XML document + * @return Deserialized {@link Document} from input XML + * @throws XMLStreamException XML parser has an error + * @throws IOException + */ + public static Document validateXMLAgainstXXEAndSSRFAttacks(InputStream is) throws XMLStreamException, IOException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + setXMLParserFlagsAgainstXXEAndSSRFAttacks(dbf); + + try { + //validate input stream + return dbf.newDocumentBuilder().parse(is); + + } catch (SAXException e) { + log.error("XML data validation FAILED with msg: " + e.getMessage(), e); + throw new XMLStreamException("XML data validation FAILED with msg: " + e.getMessage(), e); + + } catch (ParserConfigurationException e) { + log.error("XML data validation FAILED with msg: " + e.getMessage(), e); + throw new XMLStreamException("XML data validation FAILED with msg: " + e.getMessage(), e); + + } catch (IOException e) { + log.error("XML data validation FAILED with msg: " + e.getMessage(), e); + throw new XMLStreamException("XML data validation FAILED with msg: " + e.getMessage(), e); + + } + + }
}
|