Architecture Net

       

Утверждение разрешений


Метод Assert Утвердить) позволяет вам требовать разрешение, даже если у вас нет соответствующих грав доступа. Вам также может потребоваться утвердить разрешение еще и потому, что, хотя ваша сборка и обладает нужным правом, но другие вызовы из цепочки вызовов егоне имеют. Утверждать вы можете только те разрешения, которые предоставлены вашейсборкой. Если бы это было не так, то обойти защиту общеязыковой среды выполненияСЬК было бы очень легко.
При внполнении примера SimplePermissionCodeDenial утверждается разрешшие FilelOPermission и делается попытка чтения файла.

fileIOPerm->Deny() ;
fileIOPerm->Assert();
ReadFilet);
ReadFileWithAssert(filelOPerm);
ReadFile() ;

Но прочитать файл не удается! Утверждение действует только в вызванном методе. Метод ReadFileWithAssert может читать файл потому, что утверждает разрешение во время своего выполнения, а затем пытается выполнить чтение. Метод Assert (Утвердить) останавливает просмотр стека разрешений, и потому выше стекового фрейма разрешения не проверяются, так что выполнение действия будет продолжено, но самих разрешений метод не выдает. Поэтому если код, расположенный ниже стекового фрейма (такой, как ReadFile), пытается требовать разрешение, в котором было отказано (так делает конструктор Filelnfo), то будет запущено исключение SecurityException11. Аналогично, Deny (Запретить) не дает выполнять действие тем вызывающим программам, которые расположены выше в стековом фрейме, а не на текущем уровне

.static void ReadFileWithAssert(FilelOPermission *f)
{
try {
f->Assert(); Console::WriteLine(
"File Permission Asserted in same procedure as read.");
// "Разрешение Файла, утвержденное
// в той же самой процедуре, что и чтение.
" Filelnfo *file = new Filelnfo(filename);
// имя файла
StreamReader *sr = file->OpenText();

// файл
String *text;

// Строка
text = sr->ReadLine(); // текст
while (text != 0)
{
Console::WriteLine(" {0}", text); // текст
text = sr->ReadLine(); // текст
}
sr->Close();
}
catch(SecurityException *se)
{
Console::WriteLine(
"Could not read file: {0}", se->Message); // Сообщение
// "He смог прочитать файл: "
}
}

He забывайте, что Assert (Утвердить) применяется только к операциям ввода-вывода, выполняемым в данной программе для указанного файла, который передается конструктоpy FilelOPermission. Вызов Assert (Утвердить) действует до тех пор, пока не завершится выполнение кода, в котором он находится. Следовательно, попытка выполнить ReadFile будет неудачной, если она делается после завершения ReadFileWithAssert. RevertAssert удаляет все текущие запросы Assert (Утвердить).
Метод Assert (Утвердить) создает бреши в защите, ведь какая-нибудь вызывающая программа из стекового фрейма вполне может использовать программу, которая вызывает этот метод как раз для нарушения безопасности. Любое использование Assert (Утвердить) должно рассматриваться с позиций защиты.
Запустите программу SimplePermissionCodeDenial и понаблюдайте за ее выводом.

CompEbook.ru Железо, дизайн, обучение и другие



Содержание раздела