Sicherheit und Serialisierung
Da anderer Code durch die Serialisierung Objektinstanzdaten anzeigen oder modifizieren kann, auf die andernfalls nicht zugegriffen werden könnte, wird für Code, der eine Serialisierung ausführt, eine spezielle Berechtigung benötigt: SecurityPermission unter Angabe des SerializationFormatter-Flags. Entsprechend der Standardrichtlinie bedeutet dies, dass diese Berechtigung nicht für aus dem Internet heruntergeladenen Code oder Code aus einem Intranet erteilt wird. Diese Berechtigung wird nur für Code auf dem lokalen Computer erteilt.
Normalerweise werden alle Felder einer Objektinstanz serialisiert. Das heißt, dass die Daten in den serialisierten Daten für die Instanz dargestellt werden. Code mit der Fähigkeit zum Interpretieren des Formats kann unabhängig von der Zugänglichkeit des Members die Datenwerte bestimmen. Bei der Deserialisierung werden Daten aus der serialisierten Darstellung extrahiert und der Objektzustand wird direkt festgelegt, wobei die Zugriffsregeln ebenso keine Rolle spielen.
Legen Sie nach Möglichkeit jedes Objekt, das sicherheitsrelevante Daten enthalten kann, als nicht serialisierbar fest. Wenn das Objekt serialisierbar sein muss, sollten die Felder mit vertraulichen Daten als nicht serialisierbar festgelegt werden. Wenn dies nicht möglich ist, muss berücksichtigt werden, dass diese Daten für jeglichen Code mit Serialisierungsberechtigung verfügbar gemacht werden. Stellen Sie sicher, dass kein bösartiger Code diese Berechtigung erhalten kann.
Die ISerializable-Schnittstelle ist nur für die Verwendung durch die Serialisierungsinfrastruktur bestimmt. Wenn sie nicht geschützt ist, können jedoch möglicherweise vertrauliche Informationen freigegeben werden. Wenn Sie die benutzerdefinierte Serialisierung durch die Implementierung von ISerializable bereitstellen, müssen die folgenden Vorsichtsmaßnahmen getroffen werden:
Die GetObjectData-Methode muss explizit gesichert werden, indem Sie die SecurityPermission unter Angabe der SerializationFormatter-Berechtigung fordern, oder indem Sie sicherstellen, dass mit der Methodenausgabe keine vertraulichen Informationen freigegeben werden. Beispiel:
Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)> _ Sub GetObjectData(info As SerializationInfo, context As StreamingContext) End Sub
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter =true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { }
Der spezielle Konstruktor für die Serialisierung muss außerdem eine eingehende Validierung von Eingaben ausführen. Er muss entweder geschützt oder als privat festgelegt werden, um Missbrauch durch bösartigen Code zu verhindern. Dabei müssen dieselben Sicherheitsüberprüfungen und Berechtigungen erzwungen werden, die beim Abrufen einer Instanz einer solchen Klasse auf andere Weise erforderlich sind, beispielsweise beim expliziten oder indirekten Erstellen der Klasse über eine Factory.