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


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

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

Члены Assert, Deny и PermitOnly перечисления SecurityAction называются модификаторами проверки стека. Эти члены игнорируются, если они используются как декларативные атрибуты для объявлений неуправляемого вызова и инструкций IDL.

Примеры вызовов неуправляемого кода

Примеры вызовов неуправляемого кода в этом разделе иллюстрируют использование атрибута RegistryPermission с модификаторами проверки стека.

В следующем примере кода модификаторы SecurityActionAssert, Deny и PermitOnly игнорируются.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    private static extern bool CallRegistryPermissionAssert();

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

Но модификатор Demand в следующем примере принимается.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

Модификаторы SecurityAction действительно правильно работают, если они заданы для класса, содержащего (инкапсулирующего) вызов неуправляемого кода.

[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
public ref class PInvokeWrapper
{
public:
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();
};
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
class PInvokeWrapper
{
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();
}

Модификаторы SecurityAction также правильно работают во вложенном сценарии, когда они задаются для вызывающего объекта вызова неуправляемого кода:

{
public ref class PInvokeWrapper
public:
    [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();

    [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    public static bool CallRegistryPermission()
    {
     return CallRegistryPermissionInternal();
    }
};
class PInvokeScenario
{
    [DllImport(“MyClass.dll”, EntryPoint = “CallRegistryPermission”)]
    private static extern bool CallRegistryPermissionInternal();

    [RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    public static bool CallRegistryPermission()
    {
     return CallRegistryPermissionInternal();
    }
}

Примеры COM-взаимодействия

Примеры COM-взаимодействия, приведенные в этом разделе, показывают использование атрибута RegistryPermission с модификаторами проверки стека.

Следующие объявления интерфейса COM-взаимодействия игнорируют модификаторы Assert, Deny и PermitOnly, аналогично примерам вызовов неуправляемого кода в предыдущем разделе.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
    bool CallFileIoPermission();
}

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDenyStubsItf
{
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
    bool CallFileIoPermission();
}

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    bool CallFileIoPermission();
}

Кроме того, модификатор Demand недопустим в сценариях объявления интерфейсов COM-взаимодействия, как показано в следующем примере.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDemandStubsItf
{
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallFileIoPermission();
}

См. также

Основные понятия

Разрешения безопасности

Создание прототипов в управляемом коде

Использование неуправляемых функций DLL

Ссылки

SecurityAction

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

Взаимодействие с неуправляемым кодом

Взаимодействие