Share via


Automatische Deserialisierung in .NET Remoting

In Remotingsystemen, bei denen eine Typüberprüfung zur Laufzeit erfolgt, muss ein Remotestream deserialisiert werden, bevor er verwendet werden kann, und ein nicht autorisierter Client kann den Zeitpunkt der Deserialisierung für den Zugriff ausnutzen. Zum Schutz vor dieser Art von Angriff bietet .NET Remoting zwei Ebenen der automatischen Deserialisierung, Low und Full. Low (der Standardwert) schützt vor Deserialisierungsangriffen, indem nur die Typen deserialisiert werden, die den grundlegendsten Remotingfunktionen zugeordnet sind: z. B. die automatische Deserialisierung von Typen der Remotinginfrastruktur, eine begrenzte Menge systemimplementierter Typen und eine Basismenge benutzerdefinierter Typen. Die Deserialisierungsebene Full unterstützt die automatische Deserialisierung aller Typen, die in allen Situationen beim Remoting unterstützt werden.

Vorsicht   Beschränken Sie die Sicherheitsmaßnahmen für Ihre Anwendungen nicht nur auf die Kontrolle der Deserialisierung. Bei verteilten Anwendungen kann selbst eine starke Kontrolle der Serialisierung nicht verhindern, dass nicht autorisierte Clients in die Kommunikation eingreifen und diese auf eine bestimmte Weise nutzen, selbst wenn dabei lediglich die Daten dritten Personen angezeigt werden. Obwohl die Deserialisierungsebene Low einigen Schutz vor bestimmten Angriffsformen bietet, die auf der automatischen Serialisierung basieren, sollten Sie daher einen möglichst effizienten Schutz der Daten durch Authentifizierung und Verschlüsselung in Betracht ziehen. Weitere Informationen finden Sie unter Sicherheit.

In den folgenden Listen werden die Deserialisierungsebenen für .NET Remoting beschrieben:

  • Low (Standardebene)

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

    • Objekte der Remotinginfrastruktur. Diese Typen sind für die grundlegende Durchführung von Remoting erforderlich.
    • Primitive Typen sowie Verweis- und Werttypen, die aus primitiven Typen zusammengesetzt sind.
    • Verweis- und Werttypen, die mit dem SerializableAttribute-Attribut gekennzeichnet sind, jedoch nicht die ISerializable-Schnittstelle implementieren.
    • Vom System bereitgestellte Typen, die ISerializable implementieren und außerhalb der Serialisierung keine anderen Forderungen stellen.
    • Vom System bereitgestellte Typen, die ISerializable implementieren oder mit SerializableAttribute markiert und in einer Assembly vorhanden sind, die nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut markiert ist.
    • Benutzerdefinierte Typen, die einen starken Namen aufweisen und sich in einer Assembly befinden, die nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut markiert ist.
    • Benutzerdefinierte Typen, die ISerializable implementieren und neben der Serialisierung keine anderen Forderungen ausgeben.
    • Typen, die die ILease-Schnittstelle implementieren und keine MarshalByRefObject-Objekte sind.
    • ObjRef-Objekte, die zur Aktivierung verwendet werden (um clientaktivierte Objekte zu unterstützen), d. h., der Client kann das zurückgegebene ObjRef deserialisieren, der Server jedoch nicht.
  • Full

    Die Deserialisierungsebene Full in .NET Remoting unterstützt alle sonstigen Szenarios, einschließlich der Deserialisierung der folgenden zusätzlichen Typen:

    • Als Parameter übergebene ObjRef-Objekte.
    • Objekte, die die ISponsor-Schnittstelle implementieren.
    • Objekte, die durch die IContributeEnvoySink-Schnittstelle zwischen dem Proxy und der Clientpipeline eingefügt werden.

    Wenn die Anwendung Remotingfeatures verwenden muss, die nur auf der Deserialisierungsebene Full verfügbar sind, müssen Sie den Authentifizierungstyp und die Verschlüsselungsebene angeben, die bei der Anwendung dieser erweiterten Funktionen in Remoteszenarios für einige gefährdete Ressourcen erforderlich sind.

Die Deserialisierungsebene kann programmgesteuert oder unter Verwendung einer Konfigurationsdatei festgelegt werden.

Programmgesteuertes Festlegen der Deserialisierungsebene

Wenn die Deserialisierungsebene programmgesteuert festgelegt werden soll, übergeben Sie bei der Erstellung die folgende Eigenschaft an das SoapServerFormatterSinkProvider-Objekt oder das BinaryServerFormatterSinkProvider-Objekt. Das Remotingsystem legt anschließend den Wert auf das Formatierungsprogramm fest, wenn es in die Empfängerkette eingefügt wurde. Im folgenden Beispiel wird veranschaulicht, wie die Deserialisierungsebene in einer Hostanwendungsdomäne auf Full festgelegt wird.

[C#]

// 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);

[Visual Basic]

' 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.

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.)

Dim chan As New TcpChannel(props, null, provider)

Festlegen der Deserialisierungsebene mit einer Anwendungskonfigurationsdatei

Wenn die Deserialisierungsebene mit einer Konfigurationsdatei festgelegt werden soll, müssen Sie das typeFilterLevel-Attribut des <formatter>-Elements explizit angeben. Obwohl dies i. d. R. auf dem Server ausgeführt wird, müssen Sie dieses Attribut auch festlegen, um die Deserialisierungsebene für alle Channels auf dem Client zu steuern, die für die Überwachung auf Rückrufe registriert sind. Im folgenden Beispiel wird die Deserialisierungsebene für SoapFormatter und 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>

</configuration>

Siehe auch

Konfiguration | RemotingConfiguration | BinaryServerFormatterSinkProvider.TypeFilterLevel | BinaryFormatter.FilterLevel