2017-03-13 4 views
2

Gibt es eine Möglichkeit zu verhindern, dass .NET XmlReader Klasse XML-Entitäten in ihren Wert beim Lesen des Inhalts erweitern?Verhindern, dass XmlReader XML-Entitäten erweitert

Zum Beispiel: Angenommen die folgende XML als Eingabe verwendet wird:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE author PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent" > 
<author>&aacute;</author> 

Nehmen wir an, es nicht möglich ist, die externe OASIS DTD, die für die Erweiterung der aacute Einheit zu erreichen. Ich möchte, dass der Leser nacheinander das Autorelement, dann den aacute Knoten des Typs EntityReference und schließlich das Autorenendelement liest, ohne irgendwelche Fehler zu werfen. Wie kann ich das erreichen?

UPDATE: Ich möchte auch die Erweiterung von Zeichen Entitäten wie &#x00E1; verhindern.

+0

Welche .net Framework-Version? – galakt

+0

@galakt .NET 4.5 –

Antwort

1

Eine Möglichkeit, das zu tun ist verwenden `XmlTextReader‘, wie folgt aus:

using (var reader = new XmlTextReader(@"your url")) 
{ 
    // note this 
    reader.EntityHandling = EntityHandling.ExpandCharEntities; 
    while (reader.Read()) 
    { 
     // here it will be EntityReference with no exceptions 
    } 
} 

Wenn das keine Option ist - Sie mit XmlReader das gleiche zu tun, aber einige Reflexion wird (zumindest ich erforderlich keine andere Möglichkeit kennen):

using (var reader = XmlReader.Create(@"your url", new XmlReaderSettings() { 
    DtdProcessing = DtdProcessing.Ignore // or Parse 
})) { 
    // get internal property which has the same function as above in XmlTextReader 
    reader.GetType().GetProperty("EntityHandling", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(reader, EntityHandling.ExpandCharEntities); 
    while (reader.Read()) { 
      // here it will be EntityReference with no exceptions 
    } 
} 
+0

Das ist ziemlich nah an dem, was ich suche, aber ich möchte auch die Erweiterung von Char-Entitäten ebenso verhindern. Die Werte der EntityHandling-Enumeration erlauben diesen Fall ebenfalls nicht. –

+0

@GabrielS Ich verstehe, dass Sie keine Entitäten erweitern möchten, aber warum nicht Zeichen Entitäten erweitern? – Evk

+0

Die Anwendung, an der ich gerade arbeite, muss die Kontrolle über die Erweiterung aller XML-Entitäten übernehmen, da sie einige benutzerdefinierte Verarbeitungen für jeden von ihnen ausführt. Aus diesem Grund müssen nicht-expandierte Entity-Referenzen von 'XmlReader' anstelle des erweiterten Ergebnisses empfangen werden. –

1

XML-Parsing ist gefährlich. In einigen Fällen erlaubt es CVEs und Denial-of-Service-Angriffe.

Zum Beispiel CVE-2016-3255

Auch auf Black Hat EU 2013

Die am meisten interessiert Dokument disscussed wurde, ist MLDTDEntityAttacks , die Implementationen und Recomendations für Entwickler zur Verfügung stellt.

Abrufen von Ressourcen:

<!DOCTYPE roottag [ 
<!ENTITY windowsfile SYSTEM "file:///c:/boot.ini"> 
]> 
<roottag> 
<sometag>&windowsfile;</sometag> 
</roottag> 

DoS:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE root 
    [ 
    <!ENTITY a0 "test" > 
    <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;"> 
    <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;"> 
    <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;"> 
    <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;"> 
    ]> 
<root>&a4;</root> 

Zurück zu Ihrer Frage.
Wie @Evk schrieb: Durch die Einstellung EntityHandling können Sie verhindern, alle Entitäten außer CharEntities zu erweitern.

Ich weiß nicht, Lösung zu verhindern, erweitern Sie CharEntity mit Ausnahme Ihrer eigenen XmlReader-Implementierung.

Ich glaube, Sie auch verhindern wollen Parsen &amp; &apos; &lt; &gt; &quot;

FYI, wie und wo XmlTextReader parst CharEntity

XmlTextReader
ParseElementContent
& case
ParseText
Char entity case
ParseCharRefInline

Diese Funktion analysiert schließlich eine numerische Zeichenentitätsreferenz (z. &#32; und &#x00E1;)
ParseNumericCharRefInline


Diese Funktion analysiert benanntes Zeichen-Entity-Referenz (&amp; &apos; &lt; &gt; &quot;)
ParseNamedCharRef

+0

Obwohl Ihre Links zu den genauen Teilen der Code-Handling-Entitäten hilfreiche Einblicke liefern, ist das Umschreiben des 'XmlTextReaderImpl' für mich keine wirkliche Option. Ich sehe auch keine Möglichkeit, diesen bestimmten Teil von dieser Klasse zu erben und zu überschreiben, zumal er nicht einmal öffentlich ist. Die einzige Option, die ich gerade sehe, ist die Vorverarbeitung des XML, um die Entitäten in einen speziellen Text zu ändern, der nicht länger als Entitätsverweise durch den 'XmlReader' betrachtet wird, den ich dann aber nicht expandiert verarbeiten kann. –

Verwandte Themen