7

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

在 [Microsoft's Site][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);
    }
}

但是在 SecurityAction.LinkDemand 的文档中,它明确表示不要在 .NET 4.0 中使用它(这是我正在使用的)。我应该改用什么?那个属性甚至是必要的吗?

威廉

4

1 回答 1

9

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

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

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

于 2012-05-08T18:14:20.110 回答