Как мне успокоить FxCop, когда получателю / установщику свойств требуется LinkDemand?

У меня есть свойство Foo в классе Bar:

public int Foo
{
   get
   {
      return GetFoo();
   }
   set
   {
      SetFoo(value);
   }
}

Оба GetFoo и SetFoo украшены:

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]

В результате FxCop правильно жалуется, что свойство Foo (или, скорее, его неявные методы получения и установки) не имеют того же LinkDemand:

CA2122: Microsoft.Security: 'Bar.Foo.get ()' вызывает 'Bar.GetFoo ()', который имеет LinkDemand. Делая этот вызов, Bar.GetFoo () косвенно подвергается воздействию пользовательского кода. Просмотрите следующий стек вызовов, который может раскрыть способ обхода защиты:

Однако, когда я попытался применить тот же атрибут SecurityPermission к свойству, чтобы исправить это предупреждение, оказалось, что свойства не являются допустимой целью для этого атрибута.

Как мне правильно исправить это предупреждение FxCop?


edit: ответить на комментарий Эрика Липперта "зачем вообще LinkDemand"?

  1. Я написал функцию, используя Marshal.GetIUnknownForObject, у которой есть LinkDemand для разрешения неуправляемого кода.
  2. Я запустил FxCop, который пожаловался на CA2122.
  3. Я искал в Google CA2122 подсказки о том, что означает ошибка и как ее решить.
  4. В первом первом обращении к Google Я видел совет Майкла Фаннинга использовать LinkDemand для устранения ошибки.

Прочитав вашу реакцию, которая, кажется, ставит под сомнение мое здравомыслие, я быстро догадался, что совет Фаннинга неприменим в моем случае. Я прочитал статью Спрос против LinkDemand и вместо этого попытается использовать Demand.


person Wim Coenen    schedule 06.10.2009    source источник
comment
Еще один хороший вопрос, который следует задать: зачем вы запрашиваете ссылку для разрешения неуправляемого кода? Это кажется мне чрезвычайно опасным занятием. Вы можете объяснить, почему это не полный спрос?   -  person Eric Lippert    schedule 06.10.2009
comment
Re: ваши обновления: важно помнить, что запрос ссылки означает, что я пропущу расходы на полный запрос; в обмен на лучшую производительность мой вызывающий несет ответственность за обеспечение безопасного использования этого метода. Если вы вызываете, то вы теперь несете ответственность за то, чтобы ни один злоумышленник не мог злоупотребить базовым методом, используя ваш код. Вы можете сделать это, переложив ответственность дальше и потребовав от вашего вызывающего абонента взять на себя ответственность, или вы можете подать полное требование, или вы можете найти другой способ сохранить его в безопасности.   -  person Eric Lippert    schedule 07.10.2009
comment
+1 за ответ на комментарий Эрика. Почему требуется ссылка? Потому что FxCop сказал мне.   -  person Ian Boyd    schedule 28.11.2011


Ответы (2)


Вы должны иметь возможность напрямую применять атрибут к геттеру и сеттеру, то есть:

public int Foo
{
   [SecurityPermission(...)]
   get
   {
      return GetFoo();
   }

   [SecurityPermission(...)]
   set
   {
      SetFoo(value);
   }
}
person Eric Rosenberger    schedule 06.10.2009

просто для справки вы можете украсить его, используя

[PermissionSetAttribute (SecurityAction.LinkDemand, Name = "FullTrust")]

см. страницу: что означает это предупреждение системы безопасности (класс .Net Process )?

person cpoDesign    schedule 06.06.2012