2016-08-19 2 views
8

Я внедряю проверку 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> 

Но это не работает, как я могу это исправить?

+0

Не следует ли исключать модули javax.xml.bind.api или com.sun.xml.bind? –

+0

Я использую 'JAXP', так как все, что я делаю, это синтаксический анализ xml. AFAIK 'JAXB' используется для привязки документов XML к объектной модели java. –

+0

Также, используя аргумент '-jaxpmodule', jboss-modules.jar позволяет нам указать реализацию модуля JAXP. Нет такого аргумента для любого другого модуля 'JBoss'. Означает ли это, что предполагалось указать реализацию JAXP через только командную строку? –

ответ

-1

Вместо того, чтобы пытаться удалить JAR из среды выполнения сервера. Всегда желательно исключить эти JAR из вашего проекта во время выполнения. Если вы используете Maven для управления зависимостями, то для этого конкретного JAR в вашем pom.xml вы можете просто предоставить область для этого JAR как «предоставленную». Расширенная область показывает, что этот JAR будет использоваться для времени компиляции, и во время выполнения он будет быть предоставлен самой средой выполнения.

+0

Как можно исключить зависимость, указанную JBoss, используя maven? –