CA2120: Zabezpieczaj konstruktory serializacji
Pozycja | Wartość |
---|---|
Ruleid | CA2120 |
Kategoria | Microsoft.Security |
Zmiana powodująca niezgodność | Kluczowa |
Przyczyna
Typ implementuje System.Runtime.Serialization.ISerializable interfejs, nie jest delegatem ani interfejsem i jest zadeklarowany w zestawie, który umożliwia częściowo zaufanym obiektom wywołującym. Typ ma konstruktor, który przyjmuje System.Runtime.Serialization.SerializationInfo obiekt i System.Runtime.Serialization.StreamingContext obiekt (podpis konstruktora serializacji). Ten konstruktor nie jest zabezpieczony przez sprawdzanie zabezpieczeń, ale jeden lub więcej zwykłych konstruktorów w typie jest zabezpieczony.
Uwaga
Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.
Opis reguły
Ta reguła jest odpowiednia dla typów, które obsługują serializację niestandardową. Typ obsługuje serializację niestandardową System.Runtime.Serialization.ISerializable , jeśli implementuje interfejs. Konstruktor serializacji jest wymagany i służy do usuwania serializacji lub ponownego tworzenia obiektów, które zostały serializowane przy użyciu System.Runtime.Serialization.ISerializable.GetObjectData metody . Ponieważ konstruktor serializacji przydziela i inicjuje obiekty, kontrole zabezpieczeń, które znajdują się na zwykłych konstruktorach, również muszą być obecne w konstruktorze serializacji. Jeśli naruszysz tę regułę, wywołujące, które nie mogły w inny sposób utworzyć wystąpienia, może użyć konstruktora serializacji, aby to zrobić.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy chronić konstruktor serializacji przy użyciu wymagań zabezpieczeń, które są identyczne z tymi, które chronią inne konstruktory.
Kiedy pomijać ostrzeżenia
Nie pomijaj naruszenia reguły.
Przykład
W poniższym przykładzie pokazano typ, który narusza regułę.
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);
}
}
}
Powiązane reguły
CA2229: Zaimplementuj konstruktory serializacji
CA2237: Oznacz typy ISerializable za pomocą atrybutu SerializableAttribute
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla