Freigeben über


Sicherheitsaspekte für "System.Xml"

Aktualisiert: November 2007

In den folgenden Abschnitten werden die verschiedenen Arten von Sicherheitsproblemen beschrieben, die beim Arbeiten mit System.Xml-Komponenten auftreten können, und es wird beschrieben, wie diese Bedrohungen reduziert werden können.

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.

  • XmlResolver-Klasse

  • "XmlReader"-Klasse und "XmlReaderSettings"-Klasse

  • "XmlTextReader"-Klasse

  • "XslCompiledTransform"-Klasse

  • Document Object Model

XmlResolver-Klasse

Die XmlResolver-Klasse wird zum Auflösen von Ressourcen 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. In .NET Framework sind zwei Implementierungen der XmlResolver-Klasse enthalten.

Die XmlUrlResolver-Klasse wird standardmäßig zum Auflösen für alle Klassen im System.Xml-Namespace verwendet. Sie unterstützt das file://-Protokoll und das http://-Protokoll und Anforderungen von der WebRequest-Klasse. Wenn Sie kein XmlResolver-Objekt angeben, das von der Anwendung verwendet werden soll, wird in i. d. R. ein XmlUrlResolver-Objekt ohne Anmeldeinformationen eines Benutzers für den Zugriff auf XML-Ressourcen verwendet.

Mit der XmlSecureResolver-Klasse kann ein anderes XmlResolver-Objekt gesichert werden. Dies erfolgt durch Wrapping des XmlResolver-Objekts und Beschränken der Ressourcen, auf die der zugrunde liegende XmlResolver zugreifen kann. Beispielsweise kann mit der XmlSecureResolver-Klasse der Zugriff auf bestimmte Internetsites oder Internetzonen verhindert werden.

Bei Verwendung der XmlResolver-Klasse sollten die folgenden Aspekte berücksichtigt werden.

  • In XmlResolver-Objekten können vertrauliche Daten enthalten sein, z. B. Anmeldeinformationen für Benutzer, mit denen auf Daten zugegriffen und diese abgerufen werden können. Sie sollten beim Zwischenspeichern von XmlResolver-Objekten sorgfältig vorgehen und das XmlResolver-Objekt nicht an nicht vertrauenswürdige Komponenten weitergeben, da diese mithilfe des XmlResolver und der zugehörigen Anmeldeinformationen für Benutzer auf Daten zugreifen können.

  • Wenn Sie eine Klasseneigenschaft entwerfen, die die XmlResolver-Klasse verwendet, sollte die Eigenschaft als eine Nur-Schreiben-Eigenschaft (d. h. als lesegeschützt) definiert sein. Mithilfe der Eigenschaft können Sie den zu verwendenden XmlResolver angeben. Sie können die Eigenschaft jedoch nicht zur Rückgabe eines XmlResolver-Objekts verwenden. Dadurch kann eine nicht vertrauenswürdige Komponente die Klasse verwenden, diese Komponente kann jedoch das XmlResolver-Objekt nicht abrufen oder direkt verwenden.

  • Wenn Ihre Anwendung XmlResolver-Objekte von nicht vertrauenswürdigem Code akzeptiert, können Sie nicht davon ausgehen, dass der an die GetEntity-Methode übergebene URI identisch mit dem URI ist, der von der ResolveUri-Methode zurückgegeben wird. Von der XmlResolver-Klasse abgeleitete Klassen können die GetEntity-Methode überschreiben und Daten zurückgeben, die sich von den Daten unterscheiden, die im ursprünglichen URI enthalten waren.

  • Ihre Anwendung kann das Risiko von Speicher-DoS-Angriffen (Denial of Service) auf die GetEntity-Methode mindern. Dies erfolgt durch die Implementierung eines gekapselten IStream, der die Anzahl der gelesenen Bytes begrenzt. Dies stellt einen Schutz für Situationen dar, in denen bösartiger Code versucht, einen unbegrenzten Byte-Datenstream an die GetEntity-Methode zu übergeben.

"XmlReader"-Klasse und "XmlReaderSettings"-Klasse

Alle System.Xml-Komponenten werden auf dem Konzept der XML-Analyse erstellt. Beispielsweise verwendet die XmlDocument-Klasse die XmlReader-Klasse, um ein Dokument und eine integrierte Darstellung eines XML-Dokuments im Speicher zu analysieren.

Es wird empfohlen, XmlReader-Objekte mithilfe der Create-Methode zu erstellen. Mit der XmlReaderSettings-Klasse wird die Gruppe von Features angegeben, die für das XmlReader-Objekt aktiviert werden sollen.

Beschränken der Größe von Dokumenten und Entitätserweiterungen

Zwischen der Speichernutzung einer Anwendung, die XmlReader verwendet, und der Größe des analysierten XML-Dokuments kann eine enge Beziehung bestehen. Im Rahmen von Denial-of-Service-Angriffen können auch übermäßig große XML-Dokumente zum Analysieren gesendet werden.

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.

DTD-Verarbeitung

Eine DTD-Verarbeitung führt möglicherweise zu einem DoS-Zustand. In der DTD sind möglicherweise geschachtelte Entitäten oder komplexe Inhaltsmodelle enthalten, deren Verarbeitung einen unangemessen langen Zeitraum beanspruchen kann.

Die DTD-Verarbeitung ist in der Standardeinstellung deaktiviert. Wenn der XmlReader DTD-Informationen erkennt, wird eine XmlException wird ausgelöst.

Schema-Verarbeitung

Das ProcessInlineSchema-Validierungsflag und das ProcessSchemaLocation-Validierungsflag eines XmlReaderSettings-Objekts werden nicht standardmäßig festgelegt. Dadurch wird der XmlReader bei der Verbarbeitung von XML-Daten aus einer nicht vertrauenswürdigen Quelle vor schemabasierten Angriffen geschützt. Wenn diese Flags festgelegt sind, wird der XmlResolver des XmlReaderSettings-Objekts verwendet, um die im Instanzdokument des XmlReader erkannten Schemaspeicherorte aufzulösen. Wenn die XmlResolver-Eigenschaft auf null festgelegt wird, werden die Schemaspeicherorte nicht aufgelöst, auch wenn das ProcessInlineSchema-Validierungsflag und das ProcessSchemaLocation-Validierungsflag festgelegt sind.

Während der Validierung hinzugefügte Schemata fügen neue Typen hinzu und können die Validierungsausgabe des validierten Dokuments ändern. Daher sollten externe Schemata nur von vertrauenswürdigen Quellen aufgelöst werden.

Es wird empfohlen, das ProcessIdentityConstraints-Flag zu deaktivieren (in der Standardeinstellung aktiviert), wenn Sie nicht vertrauenswürdige, große XML-Dokumente in Szenarien mit hoher Verfügbarkeit anhand eines Schemas validieren, das innerhalb des Dokuments einen großen Teil von Identitätseinschränkungen aufweist.

Externe Ressourcen

XML-Daten können Verweise auf externe Ressourcen (z. B. eine Schemadatei) enthalten. Standardmäßig werden externe Ressourcen mithilfe eines XmlUrlResolver-Objekts ohne Anmeldeinformationen eines Benutzers aufgelöst. Es ist daher möglich, standardmäßig auf alle Speicherorte zuzugreifen, für die keine Anmeldeinformationen erforderlich sind. Sie können dafür weitere Sicherheitsvorkehrungen treffen, indem Sie Folgendes ausführen:

Freigeben von "XmlReaderSettings"-Objekten

XmlReaderSettings-Objekte können vertrauliche Informationen (z. B. Anmeldeinformationen des Benutzers) enthalten. Eine nicht vertrauenswürdige Komponente könnte mithilfe des XmlReaderSettings-Objekts und den Anmeldeinformationen des Benutzers XmlReader-Objekte erstellen, mit denen Daten gelesen werden können. Sie sollten daher beim Zwischenspeichern von XmlReaderSettings-Objekten oder bei der Übergabe eines XmlReaderSettings-Objekts von einer Komponente an eine andere sorgfältig vorgehen.

Unterstützen von Komponenten

Verarbeitung der Daten

XML-Daten können eine Vielzahl von Attributen, Namespacedeklarationen, geschachtelten Elementen usw. enthalten, deren Verarbeitung sehr zeitaufwendig ist.

  • Sie können eine benutzerdefinierte IStream-Implementierung erstellen, mit der die Größe der verwendeten Eingabe begrenzt wird. Diese Implementierung kann für XmlReader-Klasse bereitgestellt werden.

  • Mithilfe der ReadValueChunk-Methode können Sie große Datenströme behandeln. Mit dieser Methode wird jeweils eine kleine Anzahl von Zeichen gelesen, anstatt dem ganzen Wert eine einzelne Zeichenfolge zuzuweisen.

"XmlTextReader"-Klasse

Die XmlTextReader-Klasse ist eine Legacy-Implementierung der XmlReader-Klasse.

DTD-Verarbeitung

Die DTD-Verarbeitung ist in der Standardeinstellung aktiviert. Um die DTD-Verarbeitung zu deaktivieren, müssen Sie die ProhibitDtd-Eigenschaft auf true festlegen.

Behandeln von Entitäten

Allgemeine Entitäten werden standardmäßig nicht erweitert. Allgemeine Entitäten werden beim Aufrufen der ResolveEntity-Methode erweitert.

Externe Ressourcen

XML-Daten können Verweise auf externe Ressourcen (z. B. DTD-Verweise) enthalten. Standardmäßig werden externe Ressourcen mithilfe eines XmlUrlResolver-Objekts ohne Anmeldeinformationen eines Benutzers aufgelöst.

Sie können dafür weitere Sicherheitsvorkehrungen treffen, indem Sie Folgendes ausführen:

"XslCompiledTransform"-Klasse

Die XslCompiledTransform-Klasse ist ein XSLT-Prozessor, der die Syntax von XSLT 1.0 unterstützt. Damit können Sie XML-Daten mithilfe eines XSLT-Stylesheets transformieren.

Externe Ressourcen

Stylesheets können Verweise auf externe Ressourcen (z. B. das xsl:import-Element oder das xsl:include-Element oder die document()-Funktion) enthalten.

Das xsl:import-Element bzw. das xsl:include-Element wird standardmäßig von der XslCompiledTransform-Klasse unterstützt. Die Unterstützung für die document()-Funktion wird durch die XslCompiledTransform-Klasse standardmäßig deaktiviert. Mithilfe der XsltSettings-Klasse wird die document()-Funktion aktiviert.

Die Load-Methode und die Transform-Methode enthalten Überladungen, die ein XmlResolver-Objekt als eines ihrer Argumente verwenden. Wenn kein XmlResolver angegeben ist, wird der standardmäßige XmlUrlResolver ohne Anmeldeinformationen verwendet.

Sie können die Art des Zugriffs auf externe Ressourcen steuern, indem Sie Folgendes ausführen:

  • Beschränken Sie mithilfe eines XmlSecureResolver-Objekts die Ressourcen, auf die der XSLT-Prozess zugreifen kann.

  • Wenn Sie null an das XmlResolver-Argument übergeben, kann der XSLT-Prozess keine externen Ressourcen öffnen.

Skriptblöcke

Die XslCompiledTransform-Klasse unterstützt standardmäßig keine Skriptblöcke. Skriptblöcke werden mithilfe der XsltSettings-Klasse aktiviert. XSLT-Skripts sollten nur aktiviert sein, wenn eine Skriptunterstützung erforderlich ist und Sie in einer vollständig vertrauenswürdigen Umgebung arbeiten.

Erweiterungsobjekte

Mit Erweiterungsobjekten werden XSLT-Transformationen Programmierfunktionen hinzugefügt. Dieses Feature ist standardmäßig aktiviert. Wenn Erweiterungsobjekte an die Transform-Methode übergeben werden, werden sie in XSLT-Transformationen verwendet.

Dokumentobjektmodell (DOM)

Da das DOM (Document Object Model) alle Daten im Speicher zwischenspeichert, wird von DOM-Vorgängen (z. B. Abfragen, Bearbeiten, Verschieben von Teilstrukturen zwischen Dokumenten sowie Speichern von DOM-Objekten) abgeraten, wenn Sie mit nicht vertrauenswürdigen Daten arbeiten und DoS-Angriffe (Denial of Service) zu befürchten sind. Darüber hinaus können Sie auch eine Begrenzung dafür festlegen, wie viele Daten in das DOM eingelesen werden können. Dazu können Sie eine benutzerdefinierte Datenstreamimplementierung erstellen, mit der die Größe der verwendeten Eingabe begrenzt wird, und mithilfe dieser das DOM-Objekt laden.

XmlDocument-Objekte können vertrauliche Informationen enthalten (z. B. die Anmeldeinformationen des Benutzers, die im XmlResolver-Objekt eingebettet sind). Wenn die XmlDocument.XmlResolver-Eigenschaft auf ein XmlResolver-Objekt mit Anmeldeinformationen des Benutzers festgelegt ist, sollten Sie das XmlDocument-Objekt nicht zwischenspeichern oder an eine nicht vertrauenswürdige Komponente übergeben. Eine nicht vertrauenswürdige Komponente kann mithilfe des DOM-Objekts und der eingebetteten XmlResolver-Anmeldeinformationen des Benutzers auf Daten zugreifen oder Daten laden.

Siehe auch

Konzepte

Coderichtlinien für System.Xml