2016-08-19 51 views
8

Implementuję sprawdzanie poprawności XML, które zapobiega wtargnięciu XXE (External XML Entity). Pożyczyłem kod z OWASP XXE Prevention Cheat Sheet. Mój kod wygląda następująco -jboss-deployment-structure.xml add JAXP exclusion

 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))); 

Kod działa poprawnie na moim komputerze lokalnym Windows (JDK 1.8.0_92, JBoss Application Server 8.2). Ale na maszynie QA Red Hat z podobnym config (JDK - 1.8.0_101, JBoss Application Server 8.2), to rzuca wyjątek z komunikatem -

Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized. 

Po pewnym czytania moje podejrzenie, że jest w trakcie wykonywania, niepoprawna klasa definicja jest czytana dla klasy validator. Jak to naprawić?

Aktualizacja

Okazuje się JBoss pochodzi z własnej realizacji JAXP, a mój kod musi odebrać realizację JAXP z JDK, a nie z JBoss. Można zrobić to łatwo przez przepuszczanie -jaxpmodule argumentu w standalone.sh (stosując ten mój kod wybrał prawidłową realizację JAXP również) -

java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider" 

Ale chciałbym to zrobić przy użyciu JBoss rozmieszczeniem-structure.xml i dodać wykluczenia takiego -

<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> 

Ale to nie działa, jak mogę rozwiązać ten problem?

+0

Nie należy wykluczać modułów javax.xml.bind.api lub com.sun.xml.bind? –

+0

Używam 'JAXP', ponieważ wszystko, co robię jest parsowanie xml. AFAIK 'JAXB' służy do wiązania dokumentów XML z modelem obiektu Java. –

+0

Ponadto, za pomocą argumentu "-jaxpmodule", jboss-modules.jar pozwala nam określić implementację modułu 'JAXP'. Nie ma takiego argumentu dla żadnego innego modułu 'JBoss'. Czy to oznacza, że ​​zamierzano podać implementację 'JAXP' tylko za pomocą wiersza poleceń? –

Odpowiedz

-1

Zamiast próbować usuwać pliki JAR z środowiska wykonawczego serwera. Zawsze zaleca się wykluczenie tych plików JAR z projektu w środowisku wykonawczym.E.g. Jeśli używasz Mavena do zarządzania zależnościami, to dla tego konkretnego pliku JAR w twoim pom.xml, możesz po prostu podać zakres tego pliku JAR jako "dostarczony". Zakres dostarczony wskazuje, że ten plik JAR będzie używany do kompilowania czasu, aw czasie wykonywania będzie być dostarczane przez samą aplikację.

+0

Jak można wykluczyć zależność określoną przez JBoss przy użyciu programu maven? –