C#中可序列化方法中的SecurityPermission

Wil*_*iam 6 serialization attributes c#-4.0

在Serializable类中使用SecurityPermission的重要性是什么?

在[微软网站] [1]上的一篇文章中,他们建议你编写一个Serializable类,如下所示:

[Serializable]
public class PleaseSaveMe : ISerializable
{
    public readonly int Age;
    public readonly string Name;
    public int KarateSkills;

    public PleaseSaveMe(int Age, string Name)
    {
        this.Age  = Age;
        this.Name = Name;
    }

    // Serialization Methods
    protected PleaseSaveMe(SerializationInfo info, StreamingContext context)
    {
        Age = info.GetInt32("Age");
        Name = info.GetString("Name");
        KarateSkills = info.GetInt32("KarateSkills");
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Age", Age);
        info.AddValue("Name", Name);
        info.AddValue("KarateSkills", KarateSkills);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在SecurityAction.LinkDemand的文档中,它特别指出不在.NET 4.0中使用它(我正在使用它).我应该用什么呢?该属性甚至是必要的吗?

威廉

Han*_*ant 9

好吧,使用[Serializable]属性,您明确允许代码弄乱您的私有部分.如果没有安全属性,那么在您的进程中运行的任何代码都可以创建一个类的实例,该实例是从不一定由序列化代码保存的数据反序列化的.可能会创建一个类的对象,该对象处于不一致的状态,因此可能被利用.

使用该属性,您可以明确地拒绝您不信任的代码来执行此操作.这当然是件好事.

是的,CAS在.NET 4中被弃用,主要是因为很多程序员都有像你这样的基本问题.CAS绝对难以理解,难以理解的安全性通常是不安全的.它被沙盒模型取代,MSDN文章就在这里.背景杂志文章就在这里.通常,当您允许代码加载来自您无法控制或信任的源的进程时,您只会担心这一点.考虑插件或组件不够安全的存储位置.