Я исследую безопасность доступа к коду. Требуется некоторое усилие, чтобы разобраться, поэтому я подумал, что наконец-то использую Reflector и начну исследовать, как .NET 4.0 использует атрибуты безопасности.
Метод System.IO.File.Delete
украшен атрибутом [SecuritySafeCritical]
.
Метод System.IO.File.Delete
делегирует внутренний метод InternalDelete, который украшен атрибутом [SecurityCritical]
.
У меня есть метод в одном из классов приложения MVC с именем DeleteFile, который выполняется как SecurityTransparent
(который я проверил, проверив Свойство MethodInfo.IsSecurityCritical DeleteFile
Исходя из моего текущего понимания, это означало бы, что:
[SecuritySafeCritical]
методы могут вызывать [SecurityCritical]
, поэтому исключение SecurityException не создается.[SecurityTransparent]
может вызывать [SecuritySafeCritical]
Таким образом, в основном, без настройки каких-либо готовых настроек безопасности, этот код успешно удалит фиктивный файл с именем test.txt
namespace MyTestMvcApp
{
public class FileHelpers()
{
// Has SecurityTransparent
public void DeleteFile()
{
// Will succesfully delete the file
File.Delete("test.txt");
}
}
}
Внутри метода InternalDeleteSystem.IO.File.Delete
, он использует метод CodeAccessPermission.Demand
для проверки того, что все вызывающие стек имеют метод необходимые разрешения. Что я не совсем понимаю, так это эту строку в документах MSDN CodeAccessPermission.Demand
:
Разрешения кода, вызывающего этот метод, не проверяются; проверка начинается с непосредственного вызывающего этого кода и продолжается вверх по стеку.
Итак, мой вопрос заключается в том, что если методом DeleteFileмоего приложения является SecurityTransparent
, почему разрешено вызывать метод SecurityCritical
?
Это, вероятно, сломанный пример, возможно, с некоторыми отсутствующими концепциями, но, как я уже сказал, я все еще обдумываю его, и любое понимание, которое люди могут дать, тем больше я буду развивать свое понимание.
Спасибо