Я внедряю проверку XML, которая предотвращает внедрение YEX (внешняя XML-сущность). Я заимствовал код от OWASP XXE Prevention Cheat Sheet. Мой код выглядит следующим образом -jboss-deployment-structure.xml добавить исключение JAXP
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(xsdFileURL);
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
validator.validate(new StreamSource(new StringReader(xml)));
код работает правильно на моей локальной машине окна (JDK 1.8.0_92, Wildfly 8,2). Но на машине QA Red Hat с аналогичной конфигурацией (JDK - 1.8.0_101, Wildfly 8,2), он бросает исключение с сообщением -
Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
После некоторых прочитав мои подозрения в том, что во время выполнения, неправильный класс определение считывается для класса validator
. Как это исправить?
Update
Оказывается Jboss поставляется со своей собственной реализацией JAXP
, и мой код должен выбрать реализацию JAXP от JDK, а не от JBoss. Я могу сделать это легко, передавая -jaxpmodule
аргумент в standalone.sh
(используя это, мой код выбрал правильную реализацию JAXP, а) -
java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"
Но я хотел бы сделать это с помощью JBoss-развертывания-structure.xml и добавить исключение, как это -
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<exclusions>
<module name="javax.api" /> // is the module name correct?
</exclusions>
</deployment>
</jboss-deployment-structure>
Но это не работает, как я могу это исправить?
Не следует ли исключать модули javax.xml.bind.api или com.sun.xml.bind? –
Я использую 'JAXP', так как все, что я делаю, это синтаксический анализ xml. AFAIK 'JAXB' используется для привязки документов XML к объектной модели java. –
Также, используя аргумент '-jaxpmodule', jboss-modules.jar позволяет нам указать реализацию модуля JAXP. Нет такого аргумента для любого другого модуля 'JBoss'. Означает ли это, что предполагалось указать реализацию JAXP через только командную строку? –