Quiero prevenir un ataque XXE en mi proyecto. Es un antiguo proyecto de API que se ejecuta en java 7 ( no maven ) y el servidor jboss-as-7. Pero durante la ejecución me sale el error: org.xml.sax.SAXNotRecognizedException: propiedad 'http: //javax.xml.XMLConstants/property / accessExternalDTD 'no se reconoce .

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

15:19:02,845 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at org.apache.xerces.jaxp.validation.ValidatorImpl.setProperty(ValidatorImpl.java:218)

15:19:02,846 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at com.uid.kua.web.KUARestController.authenticateAtAUA(KUARestController.java:118)

15:19:02,847 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

15:19:02,847 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

15:19:02,848 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

15:19:02,849 ERROR [stderr] (http-localhost-127.0.0.1-8080-3)   at java.lang.reflect.Method.invoke(Method.java:606)

Lo he buscado y cada foro tiene un significado diferente diciendo que es un error. No he encontrado ninguna solución relevante para esta excepción. Por favor ayuda. Gracias por adelantado.

4
Abhishek Singh 14 oct. 2019 a las 12:54

3 respuestas

La mejor respuesta

Finalmente lo resolví. Estoy publicando la respuesta en caso de que esto ayude a alguien. Después de revisar las soluciones en línea, no pude detectar el problema principal que estaba causando el error anterior. Para la prevención xxe necesitamos algunas propiedades definidas como: XMLConstants.ACCESS_EXTERNAL_DTD XMLConstants.ACCESS_EXTERNAL_SCHEMA

Necesitamos xerces y jaxp-api jars para pasar xml y evitar que xxe proporcionado por las api resuelva el xml estableciendo algunas de las propiedades anteriores. Antes de JDK 7 , estos ya estaban incluidos en JDK 7 y posteriores. Por lo tanto, no necesitamos importar los archivos jar anteriores en nuestra ruta de clases del proyecto.

En mi caso, estaba usando jboss-as-7.1.1.Final como servidor de aplicaciones que también tiene su propio jar de xerces (org.apache.xerces.) . Pero java también viene con su propia implementación de xerces y jaxp (com.sun.xerces.) . Entonces, al implementar la guerra, obtenemos el error anterior, ya que ambos frascos entran en conflicto entre sí, donde jboss carga sus propios frascos xerces.

Solución: Necesitamos excluir la implementación de jboss xerces haciendo cambios en el archivo jboss / org / apache / xerces / main / modules.xml . Comente las líneas como se muestra a continuación:

> <module xmlns="urn:jboss:module:1.1" name="org.apache.xerces">    
> <!--
>     <resources>
>         <resource-root path="xercesImpl-2.9.1-jbossas-1.jar"/>
>         Insert resources here
>     </resources>
> -->
>     <dependencies>
>         <module name="javax.api"/>
>     </dependencies>
> 
> </module>

Ahora implemente y ejecute su aplicación. Codificación feliz.

8
Abhishek Singh 23 oct. 2019 a las 11:38

Parece que los atributos accessExternalDTD y accessExternalSchema se introdujeron en JAXP 1.5. Sin embargo, Java EE 6 (e incluso Java EE 8) solo viene con JAXP 1.4.

En mi caso (que se ejecuta en WildFly 19 y AdoptOpenJDK 11) pude obtener las instancias predeterminadas del JDK de DocumentBuilderFactory y SchemaFactory utilizando su newDefaultInstance () < / em> método que se introdujo en Java 9. En Java 8 ambas clases también tienen un método newInstance donde puede especificar el nombre de la clase, es decir, com.sun.org.apache.xerces. internal.jaxp.DocumentBuilderFactoryImpl y com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory .

Esta solución evita cambiar los módulos de JBoss.

5
Michael 16 jun. 2020 a las 08:56

Buena respuesta: https://stackoverflow.com/a/62404699 Es solo un ejemplo de un código (funciona con java 11 y jboss 7.3):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
 DocumentBuilder builder = dbf.newDocumentBuilder();

 ByteArrayInputStream input = new ByteArrayInputStream(xmlDocument.getBytes(encoding));
 org.w3c.dom.Document doc = builder.parse(input);
 DOMBuilder domBuilder = new DOMBuilder();

 Document docJdom = domBuilder.build(doc);
-1
Leonid Balikhin 6 abr. 2021 a las 04:17