Coderichtlinien für System.Xml

Aktualisiert: November 2007

In den folgenden Abschnitten werden allgemeine Richtlinien für das Schützen von System.Xml-Anwendungen behandelt.

Hinweis:

Die System.Xml-Komponenten basieren auf dem Sicherheitssystem von Microsoft .NET Framework. In diesem Thema werden nur Sicherheitsaspekte berücksichtigt, die von den XML-Klassen selbst behandelt werden. Weitere Informationen finden Sie unter Sicherheit in .NET Framework.

Sicherheitsprobleme

Die Sicherheitsprobleme können in drei allgemeine Kategorien eingeteilt werden.

Zugriff von außen

Einige XML-Technologien können bei der Verarbeitung andere Dokumente abrufen. In dem gerade analysierten Dokument kann sich z. B. eine DTD (Document Type Definition) befinden. Die DTD kann sich auch in einem externen Dokument befinden, auf das in dem gerade analysierten Dokument verwiesen wird. Die XSD- und XSLT-Technologien können auch Informationen aus anderen Dateien verwenden. Diese externen Ressourcen können ein Sicherheitsproblem darstellen:

  • Wie kann sichergestellt werden, dass eine Anwendung nur Dateien von vertrauenswürdigen Sites abruft? Möchten Sie, wenn sich in einem XML-Dokument z. B. ein Verweis auf eine Datei im Internet befindet, dass Ihre Anwendung diese Datei abruft?

  • Wie stellen Sie sicher, dass eine Datei, die Sie abrufen, keine schädlichen Daten enthält?

Dienstverweigerung (Denial of Service)

Da XML-Dokumente Verweise auf andere Dateien enthalten können, ist es schwierig, den für die Analyse eines XML-Dokuments erforderlichen Verarbeitungsaufwand zu ermitteln. XML-Dokumente können z B. eine DTD enthalten. Wenn die DTD verschachtelte Entitäten oder komplexe Inhaltsmodelle umfasst, kann die Analyse des Dokuments außerordentlich viel Zeit beanspruchen.

Die folgenden Szenarios gelten als weniger empfindlich für Denial-of-Service-Angriffe, da die System.Xml-Klassen Schutz vor diesen Angriffen bieten. Weitere Informationen über die verschiedenen Arten von Sicherheitsproblemen, die beim Arbeiten mit System.Xml-Komponenten auftreten können, und wie diese Bedrohungen reduziert werden können, finden Sie unter Sicherheitsaspekte für "System.Xml".

  • Analysieren von XML-Textdaten.

  • Analysieren von binären XML-Daten, die von Microsoft SQL Server 2005 generiert wurden.

  • Schreiben von XML-Dokumenten und -Fragmenten aus Datenquellen in ein Dateisystem, einen Stream, einen TextWriter oder einen StringBuilder.

  • Laden von Dokumenten in das DOM-Objekt (Document Object Model), wenn ein XmlReader-Objekt verwendet wird und ProhibitDtd auf true festgelegt ist.

  • Navigieren im DOM-Objekt.

Die folgenden Szenarios sind nicht zu empfehlen, wenn Sie Denial-of-Service-Angriffe befürchten oder wenn Sie in einer nicht vertrauenswürdigen Umgebung arbeiten.

  • DTD-Verarbeitung.

  • Schema-Verarbeitung. Dazu gehört das Hinzufügen eines nicht vertrauenswürdigen Schemas zur Schemaauflistung, das Kompilieren eines nicht vertrauenswürdigen Schemas und das Validieren mit einem nicht vertrauenswürdigen Schema.

  • XSLT-Verarbeitung.

  • Analysieren eines beliebigen Streams von binären XML-Daten eines Benutzers

  • DOM-Operationen wie Abfragen, Bearbeiten, Verschieben von Teilstrukturen zwischen Dokumenten und Speichern von DOM-Objekten.

Bei der Verwendung von XmlReader können Sie die Größe des zu analysierenden Dokuments mit der MaxCharactersInDocument-Eigenschaft begrenzen. Sie können die Anzahl von Zeichen einschränken, die sich durch das Erweitern von Entitäten ergeben, indem Sie die MaxCharactersFromEntities-Eigenschaft einrichten. Beispiele für das Einrichten dieser Eigenschaften finden Sie in den entsprechenden Referenzthemen.

Verarbeitung

Die XSD- und die XSLT-Technologien weisen weitere Funktionen auf, die die Verarbeitungsgeschwindigkeit beeinflussen können. Es ist z. B. möglich, ein XML-Schema zu erstellen, dessen Verarbeitung bereits bei der Auswertung für ein relativ kleines Dokument erhebliche Zeit in Anspruch nimmt. Es ist auch möglich, in einen XSLT-Stylesheet Skriptblöcke einzubetten. Beides stellt für die Anwendung ein potentielles Sicherheitsrisiko dar.

Externe Ressourcen

Die XmlUrlResolver-Klasse wird standardmäßig zum Auflösen für alle Klassen im System.Xml-Namespace verwendet. Mit dieser Klasse werden XML-Dokumente geladen, externe Ressourcen aufgelöst (z. B. Entitäten, DTDs oder Schemata) und Direktiven importiert oder eingefügt.

Die APIs ermöglichen es, dieses Verhalten durch Angabe des zu verwendenden XmlResolver-Objekts zu überschreiben. Verwenden Sie die XmlSecureResolver-Klasse, wenn Sie eine Ressource öffnen möchten, die nicht von Ihnen gesteuert wird oder die nicht vertrauenswürdig ist. Der XmlSecureResolver umschließt einen XmlResolver und ermöglicht das Einschränken der Ressourcen, auf die der zu Grunde liegende XmlResolver Zugriff hat.

DTD-Verarbeitung

Akivieren Sie die DTD-Verarbeitung nicht, wenn Sie DoS-Probleme befürchten oder wenn Sie mit nicht vertrauernswürdige Quellen arbeiten. Die DTD-Verarbeitung ist für XmlReader-Objekte, die von der Create-Methode erstellt wurden, standardmäßig deaktiviert.

Hinweis:

Beim XmlTextReader ist die DTD-Verarbeitung standardmäßig aktiviert. Dieses Feature kann mit der XmlTextReader.ProhibitDtd-Eigenschaft deaktiviert werden.

Wenn die DTD-Verarbeitung aktiviert ist, können die Ressourcen, auf die der XmlReader Zugriff hat, mit dem XmlSecureResolver eingeschränkt werden. Die Anwendung kann auch den Zeit- und Speicheraufwand für die XML-Verarbeitung einschränken. In einer ASP.NET-Anwendung können z. B. Timeouts konfiguriert werden.

XSLT-Verarbeitung

Beim Erstellen einer Anwendung, die die XslCompiledTransform-Klasse verwendet, sollten Ihnen die folgenden Elemente und deren Auswirkungen bekannt sein:

  • Die XSLT-Skriptverarbeitung ist standardmäßig deaktiviert. XSLT-Skripts sollten nur aktiviert sein, wenn eine Skriptunterstützung erforderlich ist und Sie in einer vollständig vertrauenswürdigen Umgebung arbeiten.

  • Die XSLT-document()-Funktion ist standardmäßig deaktiviert. Wenn Sie die document()-Funktion aktivieren, schränken Sie die verfügbaren Ressourcen ein, indem Sie der Transform-Methode ein XmlSecureResolver-Objekt übergeben.

  • Erweiterungsobjekte sind standardmäßig aktiviert. Wenn der Transform-Methode ein XsltArgumentList-Objekt übergeben wird, das Erweiterungsobjekte enthält, so werden diese verwendet.

  • XSLT-Stylesheets können Verweise auf andere Dateien und eingebettete Skriptblöcke enthalten. Ein böswilliger Benutzer kann dies ausnutzen, indem er Daten oder Stylesheets bereitstellt, deren Verarbeitung die Ressourcen des Computers erschöpft.

  • XSLT-Anwendungen, die in einer teilweise vertrauenswürdigen Umgebung ausgeführt werden, können einem Stylesheet-Spoofing ausgesetzt sein. Ein böswilliger Benutzer könnte z. B. ein Objekt mit einem schädlichen Stylesheet laden und es an einen anderen Benutzer übermitteln, der die Transform-Methode aufruft und die Transformation ausführt.

Diese Sicherheitsprobleme können durch Deaktivieren von Skripts oder der document()-Funktion bei aus nicht vertrauenswürdigen Quellen stammenden Stylesheets und durch das Abweisen von XslCompiledTransform-Objekten, XSLT-Stylesheets und XML-Quelldaten aus nicht vertrauernswürdigen Quellen reduziert werden.

Ausnahmebehandlung

Ausnahmen, die von Komponenten auf niedrigere Ebene ausgelöst werden, könnten Informationen über Pfade offen legen, die nicht an die Anwendung weitergegeben werden sollten. Die Anwendungen müssen diese Ausnahmen abfangen und entsprechend verarbeiten.

Verwenden von "XmlTextWriter"

Wenn ein XmlTextWriter an eine andere Anwendung übergeben wird, wird der zu Grunde liegenden Stream für diese Anwendung offengelegt. Übergeben Sie an eine teilweise vertrauenswürdige Anwendung ein von der Create-Methode erstelltes XmlWriter-Objekt anstelle eines XmlTextWriter-Objekts.

Siehe auch

Aufgaben

Gewusst wie: Verwenden der XmlSecureResolver-Klasse

Weitere Ressourcen

Sicherheit und System.Xml-Anwendungen