WPF 부분 신뢰 보안WPF Partial Trust Security

일반적으로 악의적인 손상을 방지하기 위해 중요한 시스템 리소스에 직접 액세스하지 않도록 인터넷 애플리케이션을 제한해야 합니다.In general, Internet applications should be restricted from having direct access to critical system resources, to prevent malicious damage. 기본적으로 HTML 및 클라이언트 쪽 스크립팅 언어는 중요한 시스템 리소스에 액세스할 수 없습니다.By default, HTML and client-side scripting languages are not able to access critical system resources. WPF(Windows 프레젠테이션 Foundation) 브라우저에서 브라우저호스팅 응용 프로그램을 시작할 수 있으므로 유사한 제한 집합을 준수해야 합니다.Because Windows Presentation Foundation (WPF) browser-hosted applications can be launched from the browser, they should conform to a similar set of restrictions. 이러한 제한을 적용하기 위해 WPF는 코드 액세스 보안(CAS) 및 ClickOnce(WPF 보안 전략 - 플랫폼 보안참조)를 모두 사용합니다.To enforce these restrictions, WPF relies on both Code Access Security (CAS) and ClickOnce (see WPF Security Strategy - Platform Security). 기본적으로 브라우저에서 호스팅되는 응용 프로그램은 인터넷, 로컬 인트라넷 또는 로컬 컴퓨터에서 시작되는지 여부에 관계없이 인터넷 영역 CAS 사용 권한 집합을 요청합니다.By default, browser-hosted applications request the Internet zone CAS set of permissions, irrespective of whether they are launched from the Internet, the local intranet, or the local computer. 전체 권한 집합보다 적은 권한으로 실행하는 애플리케이션은 부분 신뢰로 실행된다고 할 수 있습니다.Applications that run with anything less than the full set of permissions are said to be running with partial trust.

WPF는 가능한 한 많은 기능을 부분 트러스트에서 안전하게 사용할 수 있도록 다양한 지원을 제공하며 CAS와 함께 부분 신뢰 프로그래밍에 대한 추가 지원을 제공합니다.WPF provides a wide variety of support to ensure that as much functionality as possible can be used safely in partial trust, and along with CAS, provides additional support for partial trust programming.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.This topic contains the following sections:

WPF 기능 부분 신뢰 지원WPF Feature Partial Trust Support

다음 표에는 인터넷 영역 사용 권한 집합의 제한 내에서 안전하게 사용할 수 있는 WPF(Windows 프레젠테이션 Foundation)의 상위 수준 기능이 나열되어 있습니다.The following table lists the high-level features of Windows Presentation Foundation (WPF) that are safe to use within the limits of the Internet zone permission set.

표 1: 부분 신뢰에서 안전한 WPF 기능Table 1: WPF Features that are Safe in Partial Trust

기능 영역Feature Area 기능Feature
일반General 브라우저 창Browser Window

원 사이트 액세스Site of Origin Access

IsolatedStorage(512KB 제한)IsolatedStorage (512KB Limit)

UIAutomation 공급자UIAutomation Providers

명령Commanding

IME(입력기)Input Method Editors (IMEs)

태블릿 스타일러스 및 잉크Tablet Stylus and Ink

마우스 캡처 및 이동 이벤트를 사용하여 시뮬레이션된 끌어서 놓기Simulated Drag/Drop using Mouse Capture and Move Events

OpenFileDialogOpenFileDialog

XamlReader.Load를 통한 XAML DeserializationXAML Deserialization (via XamlReader.Load)
웹 통합Web Integration 브라우저 다운로드 대화 상자Browser Download Dialog

사용자가 시작한 최상위 탐색Top-Level User-Initiated Navigation

mailto:linksmailto:links

URI(Uniform Resource Identifier) 매개 변수Uniform Resource Identifier Parameters

HTTPWebRequestHTTPWebRequest

IFRAME에 호스팅되는 WPF 콘텐츠WPF Content Hosted in an IFRAME

프레임을 사용하여 동일한 사이트 HTML 페이지 호스팅Hosting of Same-Site HTML Pages using Frame

WebBrowser를 사용하여 동일한 사이트 HTML 페이지 호스팅Hosting of Same Site HTML Pages using WebBrowser

웹 서비스(ASMX)Web Services (ASMX)

웹 서비스(Windows Communication Foundation 사용)Web Services (using Windows Communication Foundation)

스크립팅Scripting

문서 개체 모델Document Object Model
시각적 개체Visuals 2D 및 3D2D and 3D

애니메이션Animation

미디어(원본 사이트 및 도메인 간)Media (Site Of Origin and Cross-Domain)

이미지/오디오/비디오Imaging/Audio/Video
읽기Reading FlowDocumentsFlowDocuments

XPS 문서XPS Documents

포함된 시스템 글꼴Embedded & System Fonts

CFF & 트루타입 글꼴CFF & TrueType Fonts
편집Editing 맞춤법 검사Spell Checking

RichTextBoxRichTextBox

일반 텍스트 및 잉크 클립보드 지원Plaintext and Ink Clipboard Support

사용자가 시작한 붙여넣기User-Initiated Paste

선택한 콘텐츠 복사Copying Selected Content
컨트롤Controls 일반 컨트롤General Controls

이 표에서는 WPF 기능을 높은 수준에서 다룹니다.This table covers the WPF features at a high level. 자세한 내용은 Windows SDK에서 WPF의 각 멤버에 필요한 권한을 문서화합니다.For more detailed information, the Windows SDK documents the permissions that are required by each member in WPF. 또한 다음 기능에는 특별한 고려 사항을 포함하는 부분 신뢰 실행에 대한 자세한 정보가 있습니다.Additionally, the following features have more detailed information regarding partial trust execution, including special considerations.

다음 표에서는 인터넷 영역 사용 권한 집합의 제한 내에서 실행하기에 안전하지 않은 WPF 기능에 대해 간략하게 설명합니다.The following table outlines the WPF features that are not safe to run within the limits of the Internet zone permission set.

표 2: 부분 신뢰에서 안전하지 않은 WPF 기능Table 2: WPF Features that are Not Safe in Partial Trust

기능 영역Feature Area 기능Feature
일반General 창(애플리케이션 정의 창 및 대화 상자)Window (Application Defined Windows and Dialog Boxes)

SaveFileDialogSaveFileDialog

파일 시스템File System

레지스트리 액세스Registry Access

끌어서 놓기Drag and Drop

XamlWriter.Save를 통한 XAML 직렬화XAML Serialization (via XamlWriter.Save)

UIAutomation 클라이언트UIAutomation Clients

소스 창 액세스(HwndHost)Source Window Access (HwndHost)

완전한 음성 지원Full Speech Support

Windows Forms 상호 운용성Windows Forms Interoperability
시각적 개체Visuals 비트맵 효과Bitmap Effects

이미지 인코딩Image Encoding
편집Editing RTF(서식 있는 텍스트) 클립보드Rich Text Format Clipboard

전체 XAML 지원Full XAML support

부분 신뢰 프로그래밍Partial Trust Programming

XBAP 응용 프로그램의 경우 기본 권한 집합을 초과하는 코드는 보안 영역에 따라 다른 동작을 갖습니다.For XBAP applications, code that exceeds the default permission set will have different behavior depending on the security zone. 일부 경우에는 사용자가 설치를 시도할 때 경고를 받게 됩니다.In some cases, the user will receive a warning when they attempt to install it. 사용자는 설치를 계속하거나 취소하도록 선택할 수 있습니다.The user can choose to continue or cancel the installation. 다음 표에서 각 보안 영역의 동작 및 애플리케이션이 완전 신뢰를 받기 위해 수행해야 하는 작업을 설명합니다.The following table describes the behavior of the application for each security zone and what you have to do for the application to receive full trust.

보안 영역Security Zone 동작Behavior 완전 신뢰 얻기Getting Full Trust
수집Local computer 자동 완전 신뢰Automatic full trust 어떤 조치가 필요하지 않습니다.No action is needed.
인트라넷 및 신뢰할 수 있는 사이트Intranet and trusted sites 완전 신뢰 확인Prompt for full trust 사용자가 프롬프트에서 소스를 볼 수 있도록 인증서로 XBAP에 로그인합니다.Sign the XBAP with a certificate so that the user sees the source in the prompt.
인터넷Internet "신뢰할 수 없음"과 함께 실패Fails with "Trust Not Granted" 인증서로 XBAP를 서명합니다.Sign the XBAP with a certificate.

참고

위의 표에 설명된 동작은 ClickOnce 신뢰 배포 모델을 따르지 않는 완전 신뢰 XBAP에 대한 것입니다.The behavior described in the previous table is for full trust XBAPs that do not follow the ClickOnce Trusted Deployment model.

일반적으로 허용되는 권한을 초과하는 코드는, 독립 실행형 애플리케이션과 브라우저에서 호스트된 애플리케이션 간에 공유되는 일반적인 코드일 수 있습니다.In general, code that may exceed the allowed permissions is likely to be common code that is shared between both standalone and browser-hosted applications. CAS 및 WPF는 이 시나리오를 관리하기 위한 몇 가지 기술을 제공합니다.CAS and WPF offer several techniques for managing this scenario.

CAS를 사용하여 권한 검색Detecting Permissions Using CAS

경우에 따라 라이브러리 어셈블리의 공유 코드를 독립 실행형 응용 프로그램과 XBAP 모두에서 사용할 수 있습니다.In some situations, it is possible for shared code in library assemblies to be used by both standalone applications and XBAPs. 이러한 경우 코드는 애플리케이션에서 얻은 권한 집합이 허용하는 것보다 많은 권한이 필요할 수 있는 기능을 실행할 수 있습니다.In these cases, code may execute functionality that could require more permissions than the application's awarded permission set allows. 응용 프로그램은 Microsoft .NET Framework 보안을 사용하여 특정 권한이 있는지 여부를 검색할 수 있습니다.Your application can detect whether or not it has a certain permission by using Microsoft .NET Framework security. 특히 원하는 사용 권한의 인스턴스에서 메서드를 Demand 호출하여 특정 권한이 있는지 여부를 테스트할 수 있습니다.Specifically, it can test whether it has a specific permission by calling the Demand method on the instance of the desired permission. 다음 예제는 로컬 디스크에 파일을 저장하는 기능이 있는지 여부에 대해 쿼리하는 코드입니다.This is shown in the following example, which has code that queries for whether it has the ability to save a file to the local disk:

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

namespace SDKSample
{
    public class FileHandling
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                MessageBox.Show("I can't write to local disk.");
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }


Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows

Namespace SDKSample
    Public Class FileHandling
        Public Sub Save()
            If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
                ' Write to local disk
                Using stream As FileStream = File.Create("c:\newfile.txt")
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to local disk.")
                End Using
                End Using
            Else
                MessageBox.Show("I can't write to local disk.")
            End If
        End Sub

        ' Detect whether or not this application has the requested permission
        Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
            Try
                ' Try and get this permission
                requestedPermission.Demand()
                Return True
            Catch
                Return False
            End Try
        End Function

    }
}
    End Class
End Namespace

응용 프로그램에 원하는 권한이 없는 경우 Demand 호출은 보안 예외를 throw합니다.If an application does not have the desired permission, the call to Demand will throw a security exception. 그렇지 않은 경우 사용 권한이 부여됩니다.Otherwise, the permission has been granted. IsPermissionGranted이 동작을 캡슐화하고 true 반환하거나 false 적절히 반환합니다.IsPermissionGranted encapsulates this behavior and returns true or false as appropriate.

점진적인 기능 저하Graceful Degradation of Functionality

코드에 필요한 작업을 수행할 권한이 있는지 확인하는 것은 다른 영역에서 실행될 수 있는 코드와 관련되어 있습니다.Being able to detect whether code has the permission to do what it needs to do is interesting for code that can be executed from different zones. 영역 검색이 하나의 방법이지만, 가능한 경우 사용자를 위한 대안을 제공하는 것이 좋습니다.While detecting the zone is one thing, it is far better to provide an alternative for the user, if possible. 예를 들어 부분 신뢰 애플리케이션은 격리된 스토리지에만 파일을 만들 수 있지만, 일반적으로 완전 신뢰 애플리케이션은 사용자가 원하는 모든 곳에 파일을 만들 수가 있습니다.For example, a full trust application typically enables users to create files anywhere they want, while a partial trust application can only create files in isolated storage. 파일을 만드는 코드가 완전 신뢰(독립 실행형) 애플리케이션과 부분 신뢰(브라우저에서 호스트된) 애플리케이션에서 공유되는 어셈블리에 존재하고 두 애플리케이션에서 사용자가 파일을 만들도록 하는 경우, 공유 코드는 해당 위치에 파일을 만들기 전에 부분 또는 완전 신뢰에서 실행 중인지 감지해야 합니다.If the code to create a file exists in an assembly that is shared by both full trust (standalone) applications and partial trust (browser-hosted) applications, and both applications want users to be able to create files, the shared code should detect whether it is running in partial or full trust before creating a file in the appropriate location. 다음 코드는 두 사항을 모두 보여줍니다.The following code demonstrates both.

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

namespace SDKSample
{
    public class FileHandlingGraceful
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                // Persist application-scope property to
                // isolated storage
                IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
                using (IsolatedStorageFileStream stream =
                    new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to Isolated Storage");
                }
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }


Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows

Namespace SDKSample
    Public Class FileHandlingGraceful
        Public Sub Save()
            If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
                ' Write to local disk
                Using stream As FileStream = File.Create("c:\newfile.txt")
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to local disk.")
                End Using
                End Using
            Else
                ' Persist application-scope property to 
                ' isolated storage
                Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
                Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to Isolated Storage")
                End Using
                End Using
            End If
        End Sub

        ' Detect whether or not this application has the requested permission
        Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
            Try
                ' Try and get this permission
                requestedPermission.Demand()
                Return True
            Catch
                Return False
            End Try
        End Function

    }
}
    End Class
End Namespace

대부분의 경우, 부분 신뢰 대체 항목을 찾을 수 있어야 됩니다.In many cases, you should be able to find a partial trust alternative.

인트라넷과 같은 제어된 환경에서는 사용자 지정 관리 프레임워크를 GAC(전역 어셈블리 캐시)에 클라이언트 기반 전체에 설치할 수 있습니다.In a controlled environment, such as an intranet, custom managed frameworks can be installed across the client base into the global assembly cache (GAC). 이러한 라이브러리는 완전 신뢰가 필요한 코드를 실행하고 부분 신뢰만 허용하는 응용 AllowPartiallyTrustedCallersAttribute 프로그램에서 참조할 수 있습니다(자세한 내용은 보안WPF 보안 전략 - 플랫폼 보안참조).These libraries can execute code that requires full trust, and be referenced from applications that are only allowed partial trust by using AllowPartiallyTrustedCallersAttribute (for more information, see Security and WPF Security Strategy - Platform Security).

브라우저 호스트 검색Browser Host Detection

CAS를 사용하여 사용 권한을 확인하는 것은 권한단위로 확인해야 할 때 적합한 기술입니다.Using CAS to check for permissions is a suitable technique when you need to check on a per-permission basis. 이 기술은 일반적인 프로세스의 일부인 예외 감지에 영향을 받으며, 일반적으로 권장되지 않고 성능 문제를 일으킬 수 있습니다.Although, this technique depends on catching exceptions as a part of normal processing, which is not recommended in general and can have performance issues. 대신 XAML 브라우저 응용 프로그램(XBAP)이 인터넷 영역 샌드박스 내에서만 BrowserInteropHelper.IsBrowserHosted 실행되는 경우 XAML 브라우저 응용 프로그램(XBAPs)에 대해 true를 반환하는 속성을 사용할 수 있습니다.Instead, if your XAML browser application (XBAP) only runs within the Internet zone sandbox, you can use the BrowserInteropHelper.IsBrowserHosted property, which returns true for XAML browser applications (XBAPs).

참고

IsBrowserHosted응용 프로그램이 브라우저에서 실행되고 있는지 여부만 구분하며 응용 프로그램이 실행 중인 사용 권한 집합은 구별하지 않습니다.IsBrowserHosted only distinguishes whether an application is running in a browser, not which set of permissions an application is running with.

사용 권한 관리Managing Permissions

기본적으로 XBAPs는 부분 신뢰(기본 인터넷 영역 사용 권한 집합)로 실행됩니다.By default, XBAPs run with partial trust (default Internet zone permission set). 그러나 애플리케이션의 요구에 따라 기본값에서 권한 집합을 변경할 수 있습니다.However, depending on the requirements of the application, it is possible to change the set of permissions from the default. 예를 들어 로컬 인트라넷에서 XBAPs를 시작한 경우 다음 표에 표시된 증가된 사용 권한 집합을 활용할 수 있습니다.For example, if an XBAPs is launched from a local intranet, it can take advantage of an increased permission set, which is shown in the following table.

표 3: LocalIntranet 및 인터넷 권한Table 3: LocalIntranet and Internet Permissions

사용 권한Permission attributeAttribute LocalIntranetLocalIntranet 인터넷Internet
DNSDNS DNS 서버 액세스Access DNS servers yesYes No
환경 변수Environment Variables 읽기Read yesYes No
파일 대화 상자File Dialogs 열기Open yesYes yesYes
파일 대화 상자File Dialogs 제한 없음Unrestricted yesYes No
격리된 스토리지Isolated Storage 사용자가 어셈블리 격리Assembly isolation by user yesYes No
격리된 스토리지Isolated Storage 알 수 없는 격리Unknown isolation yesYes yesYes
격리된 스토리지Isolated Storage 무제한 사용자 할당량Unlimited user quota yesYes No
미디어Media 안전한 오디오, 비디오 및 이미지Safe audio, video, and images yesYes yesYes
인쇄Printing 기본 인쇄Default printing yesYes No
인쇄Printing 안전 인쇄Safe printing yesYes yesYes
반사Reflection 내보내기Emit yesYes No
보안Security 관리되는 코드 실행Managed code execution yesYes yesYes
보안Security 부여된 권한 어셜션Assert granted permissions yesYes No
사용자 인터페이스User Interface 제한 없음Unrestricted yesYes No
사용자 인터페이스User Interface 안전한 최상위 창Safe top level windows yesYes yesYes
사용자 인터페이스User Interface 소유 클립보드Own Clipboard yesYes yesYes
웹 브라우저Web Browser HTML 안전 프레임 탐색Safe frame navigation to HTML yesYes yesYes

참고

잘라내기 및 붙여넣기는 사용자가 시작한 경우 부분 신뢰에서만 허용됩니다.Cut and Paste is only allowed in partial trust when user initiated.

권한을 높이는 경우 프로젝트 설정 및 ClickOnce 애플리케이션 매니페스트를 변경해야 합니다.If you need to increase permissions, you need to change the project settings and the ClickOnce application manifest. 자세한 내용은 WPF XAML 브라우저 응용 프로그램 개요를참조하십시오.For more information, see WPF XAML Browser Applications Overview. 다음 문서도 유용할 수 있습니다.The following documents may also be helpful.

XBAP에 완전 신뢰가 필요한 경우 동일한 도구를 사용하여 요청된 권한을 늘릴 수 있습니다.If your XBAP requires full trust, you can use the same tools to increase the requested permissions. XBAP는 로컬 컴퓨터, 인트라넷 또는 브라우저의 신뢰할 수 있거나 허용된 사이트에 나열된 URL에서 설치되고 시작된 경우에만 완전 신뢰를 받습니다.Although an XBAP will only receive full trust if it is installed on and launched from the local computer, the intranet, or from a URL that is listed in the browser's trusted or allowed sites. 인트라넷 또는 신뢰할 수 있는 사이트에서 애플리케이션이 설치되면, 사용자는 상승된 권한을 알리는 표준 ClickOnce 프롬프트를 받습니다.If the application is installed from the intranet or a trusted site, the user will receive the standard ClickOnce prompt notifying them of the elevated permissions. 사용자는 설치를 계속하거나 취소하도록 선택할 수 있습니다.The user can choose to continue or cancel the installation.

또는 모든 보안 영역에서 완전 신뢰 배포를 위한 ClickOnce 신뢰 배포 모델을 사용할 수 있습니다.Alternatively, you can use the ClickOnce Trusted Deployment model for full trust deployment from any security zone. 자세한 내용은 신뢰할 수 있는 응용 프로그램 배포 개요보안을참조하세요.For more information, see Trusted Application Deployment Overview and Security.

참고 항목See also