다음을 통해 공유


CA2120: serialization 생성자를 안전하게 하십시오.

TypeName

SecureSerializationConstructors

CheckId

CA2120

범주

Microsoft.Security

변경 수준

주요 변경

원인

형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현하고, 대리자 또는 인터페이스가 아니며, 부분 신뢰 호출자를 허용하는 어셈블리에 선언되어 있습니다. 형식에 System.Runtime.Serialization.SerializationInfo 개체 및 System.Runtime.Serialization.StreamingContext 개체(serialization 생성자의 시그니처)를 사용하는 생성자가 있습니다. 이 생성자는 보안 검사를 통해 보안되지 않지만 형식에 있는 하나 이상의 정규 생성자가 보안됩니다.

규칙 설명

이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다. 형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현할 경우 이 형식은 사용자 지정 serialization을 지원합니다. serialization 생성자는 ISerializable.GetObjectData 메서드를 사용하여 serialize된 개체를 deserialize하거나 다시 만드는 데 사용되며 필수적입니다. serialization 생성자는 개체를 할당하고 초기화하므로 정규 생성자에 있는 보안 검사는 serialization 생성자에도 있어야 합니다. 이 규칙을 위반하면 다른 방식으로는 인스턴스를 만들 수 없는 호출자가 serialization 생성자를 사용하여 인스턴스를 만들 수 있게 됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 다른 생성자를 보호하는 것과 동일한 보안 요청을 사용하여 serialization 생성자를 보호합니다.

경고를 표시하지 않는 경우

규칙 위반을 표시해야 합니다.

예제

다음 예제에서는 규칙을 위반하는 형식을 보여 줍니다.

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);
        }
    }

 }

관련 규칙

CA2229: serialization 생성자를 구현하십시오.

CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.

참고 항목

참조

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext