Automatische Deserialisierung in .NET Framework-Remoting

Dieses Thema bezieht sich auf eine veraltete Technologie, die zum Zwecke der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten wird und nicht für die neue Entwicklung empfohlen wird. Verteilte Anwendungen sollten jetzt mit  Windows Communication Foundation (WCF) entwickelt werden.

Remotesysteme, die sich auf eine Laufzeitvalidierung stützen, müssen einen Remotestream deserialisieren, um mit seiner Verwendung beginnen zu können. Ein nicht autorisierter Client könnte versuchen, den Zeitpunkt der Deserialisierung auszunutzen. Zum Schutz vor dieser Art des Angriffs stellt .NET Framework-Remoting zwei Ebenen der automatischen Deserialisierung bereit, Low und Full. Der Standardwert Low schützt vor Deserialisierungsangriffen, indem nur die Typen deserialisiert werden, denen absolut grundlegende Remotefunktionen zugeordnet sind, z. B. eine automatische Deserialisierung von Remoteinfrastrukturtypen, eine begrenzte Anzahl von Typen, die vom System implementiert werden, sowie eine Basisgruppe benutzerdefinierter Typen. Die Deserialisierungsebene Full unterstützt die automatische Deserialisierung aller Typen, die in allen Situationen von Remoting unterstützt werden.

5dxse167.Caution(de-de,VS.100).gifVorsicht:
Die Kontrolle der Deserialisierung stellt nicht die einzige Sicherheitsanforderung für Ihre Anwendung dar. Bei verteilten Anwendungen verhindert auch eine strikte Serialisierungskontrolle nicht, dass nicht autorisierte Clients Daten abfangen und verwenden, und sei es nur, um sie anderen Benutzern anzuzeigen. Obwohl die Deserialisierungsebene Low einen gewissen Schutz gegenüber bestimmten Arten von Angriffen auf der Grundlage automatischer Deserialisierung bietet, müssen Sie darüber hinaus Authentifizierungs- und Verschlüsselungsmethoden in Betracht ziehen, um Ihre Daten zu schützen. Ausführliche Informationen zu diesem Thema finden Sie unter Sicherheit.

Die folgenden Listen beschreiben die Deserialisierungsebenen von .NET Framework-Remoting:

  • Low (Standardebene)

    Die Standarddeserialisierungsebene in .NET Framework-Remoting unterstützt die Deserialisierung der folgenden Typen:

    • Remoteinfrastrukturobjekte. Dies sind die Typen, die für ein Remoting auf Basisebene erforderlich sind.

    • Primitive Typen sowie Verweis- und Werttypen, die aus primitiven Typen bestehen.

    • Verweis- und Werttypen, die mit dem SerializableAttribute-Attribut gekennzeichnet sind, die ISerializable-Schnittstelle aber nicht implementieren.

    • Vom System bereitgestellte Typen, die ISerializable implementieren und außer der Serialisierung keine anderen Anforderungen stellen.

    • Benutzerdefinierte Typen, die starke Namen haben und sich in einer nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut markierten Assembly befinden.

    • Benutzerdefinierte Typen, die ISerializable implementieren und außer der Serialisierung keine Anforderungen stellen.

    • Typen, die die ILease-Schnittstelle implementieren und keine MarshalByRefObject-Objekte sind.

    • ObjRef-Objekte, die zur Aktivierung verwendet werden, um vom Client aktivierte Objekte zu unterstützen. Das bedeutet, dass der Client das zurückgegebene ObjRef deserialisieren kann, der Server jedoch nicht.

  • Full

    Die Deserialisierungsebene Full in .NET Framework-Remoting unterstützt alle anderen Szenarien, einschließlich der Deserialisierung der folgenden zusätzlichen Typen:

    • ObjRef-Objekte, die als Parameter übergeben werden.

    • Objekte, die die ISponsor-Schnittstelle implementieren.

    • Objekte, die von der IContributeEnvoySink-Schnittstelle zwischen Proxy- und Clientpipeline eingefügt werden.

    • Delegattypen, die als Parameter übergeben werden.

    • Objekte, die von MarshalByRefObject erben und als Parameter übergeben werden.

    • ISerializable-Typen, die als Parameter übergeben werden.

    • Typen, die im GAC gespeichert und nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut markiert sind.

    Wenn die Anwendung die Verwendung von Remotefunktionen erfordert, die nur auf der Deserialisierungsebene Full verfügbar sind, müssen Sie den Authentifizierungstyp und die Verschlüsselungsebene zum Schutz von Ressourcen bereitstellen, die durch die Verwendung dieser erweiterten Features in Remoteszenarios gefährdet sein könnten.

Sie können die Deserialisierungsebene entweder programmgesteuert oder durch die Verwendung einer Anwendungskonfigurationsdatei festlegen.

Programmgesteuertes Festlegen der Deserialisierungsebene

Wenn Sie die Deserialisierungsebene programmgesteuert festlegen möchten, übergeben Sie die folgende Eigenschaft bei der Erstellung an das SoapServerFormatterSinkProvider-Objekt oder das BinaryServerFormatterSinkProvider-Objekt. Das Remotesystem legt den Wert anschließend für das Formatierungsprogramm fest, wenn es in die Senkenkette eingefügt wird. Im folgenden Beispiel wird veranschaulicht, wie die Deserialisierungsebene in einer Hostanwendungsdomäne auf Full festgelegt wird.

// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 8085;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel chan = new TcpChannel(props, null, provider);
' Creating a custom formatter for your TcpChannel sink chain.
Dim provider As New BinaryServerFormatterSinkProvider()
provider.TypeFilterLevel = TypeFilterLevel.Full
' Creating the IDictionary to set the port on the channel instance.
Dim props As IDictionary = New Hashtable()
props("port") = 8085
' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
Dim chan As New TcpChannel(props, DBNull.Value, provider)

Festlegen der Deserialisierungsebene mit einer Anwendungskonfigurationsdatei

Wenn Sie die Deserialisierungsebene mithilfe einer Konfigurationsdatei festlegen möchten, müssen Sie das typeFilterLevel-Attribut des <formatter>-Elements explizit angeben. Obwohl dies in der Regel auf der Serverseite erfolgt, müssen Sie dieses Attribut auch angeben, um die Deserialisierungsebene für alle Channels auf dem Client zu kontrollieren, der für eine Rückrufüberwachung registriert ist. Im folgenden Beispiel wird die Deserialisierungsebene für SoapFormatter und für BinaryFormatter in der Anwendungsdomäne explizit auf Low festgelegt.

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown 
type="ServiceType, common" 
objectUri="ServiceType.soap" 
mode="Singleton" 
/>
</service>
<channels>
<channel ref="http">
<serverProviders> 
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel=Low />
<formatter ref="binary" typeFilterLevel=Low />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

Siehe auch

Verweis

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

Konzepte

Konfiguration von Remoteanwendungen