2012-03-28 18 views
19

Estoy tratando de usar JAXB para desenmascarar algunos XML que utilicé xjc para crear en primer lugar. No quiero hacer ninguna validación sobre el desemparejamiento, pero a pesar de que he desactivado la validación de acuerdo con la documentación de JAXB con u.setSchema(null);, pero esto no ha impedido que se lanzara un FileNotFoundException cuando intenta ejecutarse y no puede encontrar el esquema.Cómo deshabilitar la recuperación DTD utilizando JAXB2.0

JAXBContext jc = JAXBContext.newInstance("blast"); 
Unmarshaller u = jc.createUnmarshaller(); 
u.setSchema(null); 
return u.unmarshal(blast) 

que he visto preguntas similares para deshabilitar el análisis de la validación SAX estableciendo la propiedad Apache http://apache.org/xml/features/validation/schema a false, pero no puedo conseguir el Unmarshaller usar mi propio analizador SAX.

Respuesta

7

A continuación se muestra el código de ejemplo que muestra cómo obtener una aplicación JAXB (JSR-222), para usar SAX analizador:

import java.io.FileReader; 
import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.transform.sax.SAXSource; 

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
     XMLReader xmlReader = spf.newSAXParser().getXMLReader(); 
     InputSource inputSource = new InputSource(new FileReader("input.xml")); 
     SAXSource source = new SAXSource(xmlReader, inputSource); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Foo foo = (Foo) unmarshaller.unmarshal(source); 
     System.out.println(foo.getValue()); 
    } 

} 
+9

eso no funcionó para mí, pero éstos hicieron: parser.setFeature ("http: //apache.org/xml/features/nonvalidating/load-external-dtd ", false); parser.setFeature ("http://xml.org/sax/features/validation", falso); – aerobiotic

+0

aerobiotic es correcto – sura2k

+0

[Este] (https://www.owasp.org/index.php/XML_External_Entity_ (XXE) _Prevention_Cheat_Sheet # SAXTransformerFactory) sitio web explica cómo se puede bloquear en cualquiera de los principales frameworks de Java. –

15

Sobre la base de las respuestas de @ Blaise-Doughan y @aerobiotic, aquí es una solución que funcionó para mí:

import java.io.FileReader; 
import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.transform.sax.SAXSource; 

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

public class Demo2 { 

    public static void main(String[] args) throws Exception { 

     JAXBContext jc = JAXBContext.newInstance(MyBean.class); 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
     spf.setFeature("http://xml.org/sax/features/validation", false); 

     XMLReader xmlReader = spf.newSAXParser().getXMLReader(); 
     InputSource inputSource = new InputSource(
       new FileReader("myfile.xml")); 
     SAXSource source = new SAXSource(xmlReader, inputSource); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     MyBean foo = (MyBean) unmarshaller.unmarshal(source); 
    } 
} 
+0

Esto funcionó para mí. También se agregó 'spf.setValidating (false);' Gracias – gihan

Cuestiones relacionadas