CA2120: Sichere Serialisierungskonstruktoren
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Der Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, ist kein Delegat und keine Schnittstelle, und ist in einer Assembly deklariert, in der nicht voll vertrauenswürdige Aufrufer zulässig sind. Der Typ weist einen Konstruktor auf, der neben dem System.Runtime.Serialization.SerializationInfo-Objekt auch das System.Runtime.Serialization.StreamingContext-Objekt (die Signatur des Serialisierungskonstruktors) annimmt. Dieser Konstruktor ist nicht durch eine Sicherheitsüberprüfung gesichert. Dagegen ist mindestens einer der normalen Konstruktoren des Typs gesichert.
Regelbeschreibung
Diese Regel ist relevant für Typen, die die benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt benutzerdefinierte Serialisierung, wenn durch ihn die System.Runtime.Serialization.ISerializable-Schnittstelle implementiert wird. Der Serialisierungskonstruktor ist erforderlich und wird eingesetzt für die Deserialisierung oder Neuerstellung von Objekten, die mit der ISerializable.GetObjectData-Methode serialisiert wurden. Der Serialisierungskonstruktor ordnet Objekte zu und initialisiert sie. Sicherheitsüberprüfungen, die bei normalen Konstruktoren durchgeführt werden, müssen deshalb auch bei Serialisierungskonstruktoren durchgeführt werden. Bei einem Verstoß gegen diese Regel könnten Aufrufer, die auf andere Weise keine Instanz erstellen konnten, den Serialisierungskonstruktor dazu verwenden.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, schützen Sie den Serialisierungskonstruktor mit den gleichen Sicherheitsanforderungen wie die anderen Konstruktoren.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keinen Verstoß gegen diese Regel.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen die Regel verstößt.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security;
using System.Security.Permissions;
[assembly: AllowPartiallyTrustedCallersAttribute()]
namespace SecurityRulesLibrary
{
[Serializable]
public class SerializationConstructorsRequireSecurity : ISerializable
{
private int n1;
// This is a regular constructor secured by a demand.
[FileIOPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public SerializationConstructorsRequireSecurity ()
{
n1 = -1;
}
// This is the serialization constructor.
// Violates rule: SecureSerializationConstructors.
protected SerializationConstructorsRequireSecurity (SerializationInfo info, StreamingContext context)
{
n1 = (int) info.GetValue("n1", typeof(int));
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Verwandte Regeln
CA2229: Serialisierungskonstruktoren implementieren
CA2237: Markieren von ISerializable-Typen mit SerializableAttribute
Siehe auch
Referenz
System.Runtime.Serialization.ISerializable