Share via


플랫폼 호출 보안 고려 사항

업데이트: 2007년 11월

SecurityAction 열거형의 Assert, Deny 및 PermitOnly 멤버를 스택 워크 한정자라고 합니다. 이러한 멤버가 플랫폼 호출 선언 및 COM IDL(Interface Definition Language) 문에서 선언적 특성으로 사용되는 경우 이러한 멤버는 무시됩니다.

플랫폼 호출 예제

이 단원의 플랫폼 호출 예제에서는 스택 워크 한정자와 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 한정자는 P/Invoke 호출을 포함(래핑)하는 클래스에 사용되는 경우 올바르게 작동합니다.

[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 한정자는 P/Invoke 호출의 호출자에 사용되는 중첩 시나리오에서도 올바르게 작동합니다.

{
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 interop 예제

이 단원의 COM interop 예제에서는 스택 워크 한정자와 RegistryPermission 특성을 함께 사용하는 방법을 보여 줍니다.

다음 COM interop 인터페이스 선언은 이전 단원의 플랫폼 호출 예제와 같이 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 interop 인터페이스 선언 시나리오에서 사용할 수 없습니다.

[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

기타 리소스

비관리 코드와의 상호 운용

상호 운용성