Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions api/src/org/labkey/api/util/XmlBeansUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ public static void addComment(XmlTokenSource doc, String comment)
public static final SAXParserFactory SAX_PARSER_FACTORY_ALLOWING_DOCTYPE;
public static final XMLInputFactory XML_INPUT_FACTORY;
public static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY;
public static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY_ALLOWING_DOCTYPE;

static
{
Expand All @@ -145,16 +146,9 @@ public static void addComment(XmlTokenSource doc, String comment)
SAX_PARSER_FACTORY = saxParserFactory(false);
SAX_PARSER_FACTORY_ALLOWING_DOCTYPE = saxParserFactory(true);

//noinspection XMLInputFactory
DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance();
DOCUMENT_BUILDER_FACTORY.setNamespaceAware(true);
DOCUMENT_BUILDER_FACTORY.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
DOCUMENT_BUILDER_FACTORY.setFeature("http://xml.org/sax/features/external-general-entities", false);
DOCUMENT_BUILDER_FACTORY.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
DOCUMENT_BUILDER_FACTORY.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DOCUMENT_BUILDER_FACTORY.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
DOCUMENT_BUILDER_FACTORY.setXIncludeAware(false);
DOCUMENT_BUILDER_FACTORY.setExpandEntityReferences(false);
DOCUMENT_BUILDER_FACTORY = documentBuilderFactory(false);
// Use the ALLOWING_DOCTYPE variant when parsing XML that contains a <!DOCTYPE> declaration (e.g. NCBI's eSummary responses)
DOCUMENT_BUILDER_FACTORY_ALLOWING_DOCTYPE = documentBuilderFactory(true);
}
catch (ParserConfigurationException | SAXException e)
{
Expand All @@ -181,4 +175,26 @@ private static SAXParserFactory saxParserFactory(boolean allowDocType) throws SA
result.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
return result;
}

private static DocumentBuilderFactory documentBuilderFactory(boolean allowDocType) throws ParserConfigurationException
{
//noinspection XMLInputFactory
DocumentBuilderFactory result = DocumentBuilderFactory.newInstance();
result.setNamespaceAware(true);

// Disable features that could lead to XXE or other vulnerabilities.
// When allowDocType is true the DOCTYPE declaration is permitted. External entity
// resolution remains disabled, so XXE protection is still in effect.
if (!allowDocType)
{
result.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
}
result.setFeature("http://xml.org/sax/features/external-general-entities", false);
result.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
result.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
result.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
result.setXIncludeAware(false);
result.setExpandEntityReferences(false);
return result;
}
}