2011-01-01 10 views
0

Ich habe die folgende Klasse:XML-Validierung mit XSD in Java

package com.somedir.someotherdir; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.xml.XMLConstants; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import javax.xml.validation.Validator; 

public class SchemaValidator 
{ 
private static Logger _logger = Logger.getLogger(SchemaValidator.class.getName()); 

/** 
    * @param file - the relative path to and the name of the XML file to be validated 
    * @return true if validation succeeded, false otherwise 
    */ 
public final static boolean validateXML(String file) 
{ 
    try 
    { 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = factory.newSchema(); 
    Validator validator = schema.newValidator(); 
    validator.validate(new StreamSource(file)); 
    return true; 
    } 
    catch (Exception e) 
    { 
    _logger.log(Level.WARNING, "SchemaValidator: failed validating " + file + ". Reason: " + e.getMessage(), e); 
    return false; 
    } 
} 
} 

Ich mag würde wissen, ob ich schema.newValidator("dir/to/schema.xsd") schließlich verwenden soll oder ist die aktuelle Version in Ordnung? Ich habe gelesen, dass es eine DoS-Schwachstelle gibt, vielleicht könnte jemand mehr Informationen dazu liefern? Muss der Pfad absolut oder relativ sein?
Die meisten der zu validierenden XMLs haben jeweils ihre eigene XSD, daher würde ich gerne das Schema lesen, das im XML selbst erwähnt wird (xs:noNamespaceSchemaLocation="schemaname.xsd").
Die Validierung wird nur während des Starts oder manuellen Neuladens (Serversoftware) durchgeführt.

+0

Konnten Sie Leute stoppen, meinen Code neu zu formatieren und einige Antworten zu geben ?? – jurchiks

+0

"Die meisten der zu validierenden XMLs haben jeweils ihre eigene XSD, deshalb würde ich gerne das Schema lesen, das im XML selbst erwähnt wird", vielleicht hängt das zusammen: http://stackoverflow.com/questions/2829105/validating -xml-mit-multiple-xsds-in-java – Cephalopod

+0

Verwandt vielleicht, aber nicht was ich brauche.Ich muss es nur bestätigen und ich frage, ob DIESE Weise gut ist oder ob es irgendwelche Korrekturen benötigt. Dein Code benötigt mehr Klassen/Methoden als nur diesen und das ist nicht genau das, wonach ich suche. – jurchiks

Antwort

1

Meinst du wirklich XML DTD DOS Angriff? Wenn ja, gibt es einige gute Artikel im Internet:

XML Denial-of-Service-Angriffe und Verteidigungen http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

Von IBM developerWorks. "Tip: Configure SAX parsers for secure processing".

Entity Resolution eine Reihe potenzieller Sicherheitslücken in XML öffnet [ ...]
- Die Site, auf der die externe DTD gehostet wird, kann die Kommunikation protokollieren. [...]
- Die Site, die die DTD hostet, kann das Parsing verlangsamen [...] Es kann auch die Analyse vollständig stoppen, indem eine fehlerhafte DTD bereitgestellt wird.
- Wenn die entfernte Site die DTD ändert, kann sie mit dafault-Attributwerten neue Inhalte in das Dokument einfügen. [...] Sie können den Inhalt des Dokuments ändern, indem sie Entity-Referenzen neu definieren.

Dachte, ich bin nicht sicher, dass sie direkt auf Ihr Programm angewendet werden kann, kann es einige Anhaltspunkte für weitere Untersuchungen geben

+0

Ich meine dies: http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newSchema() Beachten Sie, dass die Verwendung von Schemapositionshinweisen eine Sicherheitsanfälligkeit für Denial-of-Service-Angriffe. – jurchiks

+0

+1 Der erste Link ist eine sehr gute Lektüre. Leider funktioniert der zweite Link (@ibm) nicht mehr. – Alberto

1

Wie ich es interpretieren, die javax.xml.validation.Schema Objekt zurückgegeben von SchemaFactory.newSchema() werden versuchen, andere Schemata zu holen verweist in den xml/xsd-Dateien auf die Validierung, wie in den entsprechenden xsi:schemaLocation-Attributen angegeben. Dies bedeutet, dass:

  1. Wenn Ihre Schemata Schemata im Internet gehostet beziehen, das Schema Objekt wird versuchen, sie während der Laufzeit zu holen. Solange ich weiß, speichert die Standardimplementierung Schema diese Schemas nicht zwischen. Die W3C already reported über schlechte Kodierungspraktiken führt zu De-facto-DDoS auf ihrer Website (bis zu 130M dtd Anfragen pro Tag!).
  2. Wenn Sie externe unkontrollierte XML-Dateien überprüfen möchten, werden Sie auch der Schema ausgesetzt, die versucht, andere Schemas von "möglicherweise schlecht beabsichtigten" XML-Quellen abzurufen.

Weitere bösen Angriffsvektoren, werfen Sie einen Blick in sign's previous answer

dieser Gefahr zu vermeiden, können Sie alle externen Ressourcen lokal speichern und verwenden Sie die SchemaFactory.setResourceResolver Methode der Schema zu instruieren, wie sie zu holen.

+0

Weg zum Necro-Post ... Ich habe keine Bedenken wegen meiner XMLs, da die einzigen XSDs, die sie haben, in dem Ordner neben ihnen sind und von mir geschrieben wurden. – jurchiks

+0

Mit Necro-Post meinen Sie, dass Ihr ursprünglicher Beitrag bereits beantwortet ist? Vielleicht könnten Sie die Auflösung hinzufügen? Ich finde deinen Punkt über DoS sehr interessant, und immer noch anwendbar ... – Alberto

+0

hast du das DoS-Ding selbst erklärt. Und die Hauptfrage ist immer noch nicht beantwortet worden, aber ich habe es lange vergessen, bis Sie es abgelehnt haben. Es gibt keinen Grund zu denken, dass ich nach 3 Jahren immer noch an einer Antwort auf eine Frage wie diese interessiert wäre. – jurchiks