保护序列化构造函数

更新:2007 年 11 月

TypeName

SecureSerializationConstructors

CheckId

CA2120

类别

Microsoft.Security

是否重大更改

是否

原因

类型实现 System.Runtime.Serialization.ISerializable 接口,不是委托或接口且在允许部分受信任的调用方的程序集中声明。类型具有采用 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)的构造函数。该构造函数不受安全检查保护,但该类型中的一个或多个常规构造函数会受到保护。

规则说明

该规则与支持自定义序列化的类型相关。如果一个类型实现 System.Runtime.Serialization.ISerializable 接口,则该类型支持自定义序列化。序列化构造函数是必需的,用于反序列化或重新创建已使用 ISerializable.GetObjectData 方法序列化的对象。由于序列化构造函数会分配和初始化对象,所以序列化构造函数中必须也存在常规构造函数中存在的安全检查。如果与该规则冲突,则不能通过其他方式创建实例的调用方可使用序列化构造函数完成该操作。

如何修复冲突

要修复与该规则的冲突,请使用与保护其他构造函数的安全请求相同的安全请求来保护序列化构造函数。

何时禁止显示警告

不要禁止显示与此规则的冲突。

示例

下面的示例演示一个与该规则冲突的类型。

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

 }

相关规则

实现序列化构造函数

用 SerializableAttribute 标记 ISerializable 类型

请参见

参考

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext