Поделиться через


Прозрачный для системы безопасности код не может осуществлять подтверждение

Обновлен: Ноябрь 2007

TypeName

SecurityTransparentCodeShouldNotAssert

CheckId

CA2128

Категория

Microsoft.Security

Критическое изменение

Критическое

Причина

Код, помеченный атрибутом SecurityTransparentAttribute, не обладает достаточными разрешениями для утверждения.

Описание правила

В этом правиле выполняется анализ всех методов и типов в сборки, которая либо на 100% прозрачная, либо смешанная (прозрачная и критическая); правило помечает декларативное и императивное использование Assert.

Во время выполнения любые вызовы Assert из прозрачного кода приведут к возникновению SecurityException. Это может произойти и в прозрачных на 100% сборках, и в смешанных сборках (прозрачных и критических), где метод или тип объявляется прозрачным, но включает декларативный или императивный вызов Assert.

В версии 2.0 .NET Framework представлена новая функция, которая называется прозрачность. Отдельные методы, поля, интерфейсы, классы и типы могут быть либо прозрачными, либо критическими.

При повышении привилегий безопасности использование прозрачного кода не допускается. Поэтому все предоставляемые и запрашиваемые разрешения автоматически передаются через код вызывающему объекту или основному домену приложения. Пример передачи включает элементы Assert, LinkDemand, SuppressUnmanagedCode и код unsafe.

Устранение нарушений

Чтобы устранить эту проблему, либо пометьте код, вызывающий Assert, как SecurityCritical, либо удалите Assert.

Отключение предупреждений

Не следует отключать вывод сообщений о нарушении данного правила.

Пример

Код выдаст сбой, если SecurityTestClass является прозрачным при создании методом Assert исключения SecurityException.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        // SecurityTransparent
        void SecurityTransparentMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Один из возможных вариантов — проверить код [SecurityTransparentMethod], и в случае, если [SecurityTransparentMethod] считается безопасным для передачи, пометить [SecurityTransparentMethod] как [SecurityCritical]. Для этого требуется полный, подробный и безошибочный аудит безопасности [SecurityTransparentMethod] и внешних вызовов в [SecurityTransparentMethod] в Assert:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        void SecurityCriticalMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Второй возможный вариант — удалить Assert из кода и направить все последующие запросы разрешений на ввод-вывод файлов за пределы [SecurityTransparentMethod] вызывающему объекту с проверкой безопасности. В этом случае аудит безопасности не нужен, поскольку запросы разрешений будут переданы вызывающему объекту или домену приложения. Управление запросами разрешений осуществляется посредством политики безопасности, среды размещения и разрешений кода.

См. также

Другие ресурсы

Предупреждения безопасности