CA2120: Zabezpieczaj konstruktory serializacji
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Kategoria |
Microsoft.Security |
Złamanie zmiany |
Złamanie |
Przyczyna
Typ implementuje ISerializable interfejsu, pełnomocnik lub interfejs nie jest i jest zadeklarowany w zestawie pozwala częściowo zaufanych wywołań.Typ ma konstruktora, który ma SerializationInfo obiektu i StreamingContext obiektu (podpis konstruktora serializacji).Ten konstruktor nie jest zabezpieczony przez sprawdzenie zabezpieczeń, ale jeden lub więcej regularnych konstruktory typu jest zabezpieczona.
Opis reguły
Ta reguła jest istotne dla typów, które obsługują serializacji niestandardowej.Typ obsługuje serializacji niestandardowej, jeśli implementuje ISerializable interfejsu.Konstruktor serializacji jest wymagana i jest używany do przeprowadzić deserializacji lub ponownie utworzyć obiekty szeregowane za pomocą ISerializable.GetObjectData metody.Ponieważ konstruktora serializacji alokuje i inicjuje obiektów, kontroli bezpieczeństwa, które znajdują się na regularnych konstruktory również musi być obecny w konstruktorze serializacji.Jeśli naruszysz tę regułę, w wywoływania, które w przeciwnym razie nie można utworzyć wystąpienia w tym celu można użyć Konstruktora serializacji.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, chronić konstruktora serializacji wymogów zabezpieczeń, które są identyczne z tymi ochrony innych konstruktorów.
Kiedy do pomijania ostrzeżenia
Nie pomijaj naruszenie reguły.
Przykład
Poniższy przykład pokazuje typ, który narusza reguły.
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);
}
}
}
Zasady pokrewne
CA2229: Należy zaimplementować konstruktory serializacji
CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute