CA2120: Zabezpečte serializační konstruktory
Zboží | Hodnota |
---|---|
RuleId | CA2120 |
Kategorie | Microsoft.Security |
Změna způsobující chybu | Narušující |
Příčina
Typ implementuje System.Runtime.Serialization.ISerializable rozhraní, není delegát nebo rozhraní a je deklarován v sestavení, které umožňuje částečně důvěryhodné volající. Typ má konstruktor, který přebírá System.Runtime.Serialization.SerializationInfo objekt a System.Runtime.Serialization.StreamingContext objekt (podpis konstruktoru serializace). Tento konstruktor není zabezpečen kontrolou zabezpečení, ale jeden nebo více běžných konstruktorů v typu je zabezpečen.
Poznámka:
Toto pravidlo je zastaralé. Další informace najdete v tématu Zastaralá pravidla.
Popis pravidla
Toto pravidlo je relevantní pro typy, které podporují vlastní serializaci. Typ podporuje vlastní serializaci, pokud implementuje System.Runtime.Serialization.ISerializable rozhraní. Serializační konstruktor je povinný a používá se k de-serializaci nebo znovu vytvořit objekty, které byly serializovány pomocí System.Runtime.Serialization.ISerializable.GetObjectData metody. Vzhledem k tomu, že serializační konstruktor přiděluje a inicializuje objekty, musí být v konstruktoru serializace přítomny také kontroly zabezpečení, které jsou přítomné u běžných konstruktorů serializace. Pokud toto pravidlo porušujete, volající, kteří by jinak nemohli vytvořit instanci, by k tomu mohli použít konstruktor serializace.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, chraňte serializační konstruktor s požadavky zabezpečení, které jsou identické s těmi, které chrání ostatní konstruktory.
Kdy potlačit upozornění
Nepotlačujte porušení pravidla.
Příklad
Následující příklad ukazuje typ, který porušuje pravidlo.
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);
}
}
}
Související pravidla
CA2229: Implementovat serializační konstruktory
CA2237: Označte typy ISerializable pomocí SerializableAttribute
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro