7

SerializableクラスでSecurityPermissionを使用することの重要性は何ですか?

[Microsoftのサイト][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 に答える