Скрытая переменная в замыкании в .Net

У меня есть код С#. Он имеет некоторые параметры конфигурации, которые хранятся как автоматические свойства или частные поля. Теоретически человек, который его использует, может изменять частные переменные с помощью Reflection.

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

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

Также я попытался указать SecurityCriticalAttribute для своих полей, поскольку у вызывающей стороны может не быть доступа FullTrust, но, похоже, он не проверяет доступ к полям. Только для самих методов\классов

ОБНОВЛЕНИЕ

Я исправил это таким образом:

  • Инициализировать все переменные через конструктор
  • Все переменные имеют определение только для чтения
  • Я добавил атрибут CAS в конструктор, поэтому никто без FullTrust не может его изменить.

    [PermissionSetAttribute(SecurityAction.Demand, Unrestricted = true)]
    

Таким образом, чтобы обновить переменные, пользователю необходимо создать новый экземпляр этого класса. А затем проверка CAS проверит вызывающего абонента.

Мне не очень нравится этот подход, и если у вас есть лучший способ, я буду признателен.


person Sergey Litvinov    schedule 14.12.2013    source источник
comment
Вы не можете: stackoverflow.com/a/8357546/857807   -  person dcastro    schedule 14.12.2013
comment
Да, согласен. Но мой вызывающий абонент будет использовать домен приложения песочницы. и этот домен приложения будет иметь только разрешения Reflection. Кажется, что [PermissionSet] в конструкторе теперь отлично работает. И, наверное, да, без ограниченного AppDomain, я не могу этого отрицать.   -  person Sergey Litvinov    schedule 14.12.2013


Ответы (1)


К сожалению, модификаторы readonly в ваших полях не предотвратят модификацию после построения посредством отражения. Невозможно запретить коду с разрешениями на частное отражение вносить изменения в состояние приложения в памяти. На самом деле ReflectionPermission считается одним из «опасных» разрешений, для которого грант по сути аналогичен гранту полного доверия (http://msdn.microsoft.com/en-us/library/wybyf7a0.aspx).

Другими словами, вы можете вообще не заморачиваться с песочницей, если собираетесь предоставлять разрешения на частное отражение в песочнице...

person Nicole Calinoiu    schedule 16.12.2013
comment
ну похоже вы правы. Я думал, что если поле доступно только для чтения, то CLR запрещает его изменять, так как компилятор это запрещает. но кажется я ошибаюсь. Здесь нет счастья :( - person Sergey Litvinov; 16.12.2013