Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > [70-316] Declarative and imperative security


Автор: marcusmae 30.9.2007, 21:20
Всем привет.
Вопрос из теста :

Цитата

You create an assembly by using Visual Studio .NET for your client, military agency. The assembly is responsible for writing and reading confidential data of military movement to and from an XML data file onto an encrypted hard drive.
You need to implement security in the assembly. What should you do?


  •  Implement declarative security and execute the permission demand to allow access to the file system.
  •  Implement imperative security and execute the permission demand to allow access to the file system.
  •  Implement imperative security and execute the minimum permission request to allow access to the file system.
  •  Implement declarative security and execute the minimum permission request to allow access to the file system.



Вопрос полностью понятен. Но с моделями безопасности я знаком мало.
Подозреваю, что Виста работает по каким-то таким концептам, когда в пользовательском режиме идут minimum permission requests to allow access to the file system, а чтобы получить доступ к разделам с повышенной защитой (%Program Files%, установка программ и тд), нужен как раз permission demand to allow access to the file system. В предложенном вопросе, вероятно, нужно делать именно permission request, ведь иначе на защищённый диск никакого доступа не дадут. Я правильно рассуждаю? И, вот declarative или imperative security? = Что это означает?

Автор: tol05 1.10.2007, 00:09
Цитата(marcusmae @  30.9.2007,  21:20 Найти цитируемый пост)
И, вот declarative или imperative security? = Что это означает? 

Декларативная - использование атрибутов типа [] перед методом или классом (или сборкой). Среда выполнения считывает атрибут перед выполнением метода или загрузкой класса (или сборки) в память.
Код

[FileIOPermissionAttribute(SecurityAction.RequestMinimum, All="C:\\example\\sample.txt")]
void MyMethod()
{
...

Императивная - достижение тех же целей кодингом
Код

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");

Одним словом - это два пути решения одних и тех же задач. Декларативный метод срабатывает раньше (до выполнения кода), но императианый - гибче (может настраиваться в real-time)

я бы выбрал первый вариант (или второй), т.к. "minimum permission request" уж точно не разрешит
Цитата(marcusmae @  30.9.2007,  21:20 Найти цитируемый пост)
writing and reading confidential data

Автор: marcusmae 1.10.2007, 08:42
Атрибуты. Вот оно что. Понял.

Цитата(tol05 @  1.10.2007,  00:09 Найти цитируемый пост)
Одним словом - это два пути решения одних и тех же задач. Декларативный метод срабатывает раньше (до выполнения кода), но императианый - гибче (может настраиваться в real-time)


Ну а всё-таки, какой вариант из первых двух лучше в данной ситуации и почему?

Автор: tol05 1.10.2007, 09:01
атрибут ограничен своей областью применения (см. AtributeUsage), например, для указанного атрибута объявление так выглядит
Код

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
[AttributeUsageAttribute(AttributeTargets.Assembly|AttributeTargets.Class|AttributeTargets.Struct|AttributeTargets.Constructor|AttributeTargets.Method, AllowMultiple=true, Inherited=false)] 
public sealed class FileIOPermissionAttribute : CodeAccessSecurityAttribute

т.е. можно юзать для метода, но не для свойства. smile
с другой стороны императивный способ позволяет работать даже с часью метода (от точки затребования полномочий до выхода из метода или до изменения требований в том же методе). Т.е. в любом фрагменте кода. 
При затребовании полномочий может возникнуть исключение. Для императивного способа ты должен сам обработать исключение - для декларативного - если возникнет исключение - труба дело. Вылетим из программы.
Поэтому императивный способ имхо лучше. 
Единственное, когда применяется декларативный способ - проверки среда выполнения делает сама. Например, если для сборки указан атрибут - среда выполнения сама проверяет по всему коду нет ли недопустимых действий. Используется рефлексия и если метод А вызывает метод В, причем метод В требует полномочий, котрые метод А отвергает, то затребования полномочий не будет.

Автор: marcusmae 1.10.2007, 18:06
Императивная стратегия даёт возможность самостоятельно заниматься контролем исключений. Понятно.

Хорошо, а вот, допустим, использование атрибута
Код

[ComVisibleAttribute(true)] 
[AttributeUsageAttribute(AttributeTargets.Parameter, Inherited=true, AllowMultiple=false)] 
public sealed class ParamArrayAttribute : Attribute

чем отличается от использования ключевого слова params? Описанные Вами правила поведения здесь действуют, т.е. является ли это примером декларативности/императивности? Что-то не очень понимаю, в чём бы это могло выразиться...

Автор: tol05 1.10.2007, 19:21
тут даже не в секьюрити дело. Я смотрю. тема вырождается в объяснение правил использования атрибутов...  и синтаксиса С#? smile

Да, это декларативное программирование, но атрибут - это специфическая конструкция, предназначенная для использования рефлексией и описать ее можно тоже только через конструкции, понятные рефлексии, т.е. декларативно. 
Секъюрити здесь ни при чем. Декларативное программирования секъюрити возможно лишь потому, что среда выполнения, при работе с кодом любит и умеет работать с рефлексией. Но не нужно путать причину со следствием. Секъюрити просто использует (как дополнительную, или альтернативную,  возможность своей настройки) сушествующую технологию рефлексии (атрибутов), вот и все.

различия между params keyword и ParamArrayAttribute описаны http://msdn2.microsoft.com/en-us/library/system.paramarrayattribute.aspx
Цитата

Prefer the language constructs over this attribute        David M. Kean - MSFT   |   Edit   |   Show History (1)  

Please Wait   
 You should never need to use this attribute directly. Instead make use of the params keyword in C# and ParamArray keyword in Visual Basic.

The following example shows a method that takes a variable number of arguments.

[C#]
 
public void MethodWithVariableArguments(params string[] arguments){}

[Visual Basic]
 
Public Sub MethodWithVariableArguments(ByVal ParamArray arguments As String())
 
End Sub



Автор: marcusmae 1.10.2007, 19:40
Цитата(tol05 @  1.10.2007,  19:21 Найти цитируемый пост)
Я смотрю. тема вырождается в объяснение правил использования атрибутов...  и синтаксиса С#?

Действительно недостаточно хорошо понимаю атрибуты. Теперь вроде по-лучше. Именно потому и спросил, что фраза

Цитата(tol05 @  1.10.2007,  19:21 Найти цитируемый пост)
You should never need


является весьма мягким пожеланием, и причин/каких-либо различий не объясняется.


tol05, большое спасибо за Ваши ответы. Я узнал много нового.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)