使用反射保护价值免受变化?

时间:2010-04-25 06:35:22

标签: c# reflection

这是我写一个小第三方库的问题。在这个图书馆里我有一个像这样的课程

public class TestClass
    {
        public int TestField { get; private set; }

        public TestClass( )
        {
            TestField = 1;
        }
    }

然后我有一个像这样的类的变种形式

 public TestClass test = new TestClass( );

我面临的问题是像这样的反射

PropertyInfo field = typeof( TestClass ).GetProperty( "TestField" );
            field.SetValue( test, 2, null );

程序员可以改变这个类的内部价值。这将是非常糟糕的事情因为它可以崩溃孔库。我的问题是保护我的代码形式这种变化的最佳方法是什么。我知道我可以使用某种bool标志,因此只能更改一个值,但这不是很好的salution有更好的吗?
最诚挚的问候,
约尔丹

4 个答案:

答案 0 :(得分:6)

请理解我的意思是尊重所有人:

你在浪费时间。严重。

在指定API或合同时不考虑反思。

相信这一点。不可能停止反射。如果消费者倾向于偷看你的代码并翻转因某种原因而被隐藏的内容,那么后果就在于他们,而不是你。

答案 1 :(得分:6)

您正试图保护您的系统免受更强的攻击。如果您不信任某些代码,请使用部分信任运行它 - 然后当它要求反映您的类型时,它将被拒绝。

反思(以及DynamicMethod等相关技术)可以以足够的信任获得对数据的几乎无限制的访问权限(例如,更改字符 string没有重新分配它;因此,您必须减少对不受信任的代码的信任。

以类似的方式,对您的进程(或其加载的dll)具有调试者或管理员访问权限的任何人都可以破坏您的代码。这不是一个有趣的攻击,因为“黑客”必须已经至少至少访问代码(可能更多)。

答案 2 :(得分:2)

您甚至可以使用反射change private readonly字段。因此,您最好的选择可能是const

答案 3 :(得分:0)

如果您想要一个常量值,请使用ReadOnly值。或者只使用const

如果您希望客户(程序员)选择其中一个“安全值”,请使用Enum

编辑:显然,enum不够安全。您可以使用以下格式的readonly字段:

public class SafeValue
{
    private string _value;

    public static readonly SafeValue Value1 = new SafeValue("value1");
    public static readonly SafeValue Value2 = new SafeValue("value2");

    private SafeValue(string value)
    {
        _value = value;
    }

    public override string ToString()
    {
        return _value;
    }
}