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?
Nie należy wykluczać modułów javax.xml.bind.api lub com.sun.xml.bind? –
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. –
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ń? –