Freigeben über


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

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext