Защитить значение от изменений с помощью отражения? - PullRequest
4 голосов
/ 25 апреля 2010

вот проблемный случай, когда я пишу небольшую стороннюю библиотеку.В этой библиотеке у меня есть такой класс

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

        public TestClass( )
        {
            TestField = 1;
        }
    }

Тогда у меня есть varialbe форма этого класса, как этот

 public TestClass test = new TestClass( );

Проблема, с которой я сталкиваюсь, заключается в том, что использование такого отражения

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

программисты могут изменять внутреннее значение этого класса.это будет очень плохо, потому что это может привести к сбою библиотеки дыр.Мой вопрос заключается в том, каков наилучший способ защитить мой код от таких изменений. Я знаю, что могу использовать какой-либо флаг bool, так что значение можно изменить только одним, но это не очень хорошее приветствие, есть ли лучший?
С наилучшими пожеланиями,
Иордания

Ответы [ 4 ]

6 голосов
/ 25 апреля 2010

Вы пытаетесь защитить свою систему от чего-то, что на сильнее , чем ваш код. Если вы не доверяете определенному коду, запустите его с частичным доверием - тогда, когда он попросит отразить ваш тип, ему будет отказано.

Отражение (и связанные с ним методы, такие как DynamicMethod) могут с достаточным доверием получить практически неограниченный доступ к вашим данным (даже, например, путем изменения символов string без повторного назначения); таким образом, вы должны уменьшить доверие к недоверенному коду.

Аналогичным образом любой, кто имеет доступ к вашему процессу (или к библиотекам, которые он загружает) с помощью отладчика или администратора, может испортить ваш код. Это не интересная атака, поскольку "хакер" должен уже иметь по крайней мере такого же доступа, чем ваш код (вероятно, больше).

6 голосов
/ 25 апреля 2010

Пожалуйста, поймите, что я имею в виду это со всем уважением:

Ты зря тратишь время. Серьезно.

Отражение не должно учитываться при указании API или контракта.

Верь в это. Невозможно остановить отражение. Если потребитель склонен заглядывать в ваш код и перелистывать биты, которые были скрыты по какой-то причине, ну, последствия для них, а не вы.

2 голосов
/ 25 апреля 2010

Вы можете даже изменить поле private readonly, используя отражение Таким образом, ваша лучшая ставка может const.

0 голосов
/ 25 апреля 2010

Используйте значение 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...