Bagikan melalui


Keamanan Kepercayaan Parsial WPF

Secara umum, aplikasi Internet harus dibatasi untuk memiliki akses langsung ke sumber daya sistem penting, untuk mencegah kerusakan berbahaya. Secara default, bahasa skrip sisi HTML dan klien tidak dapat mengakses sumber daya sistem penting. Karena aplikasi yang dihosting browser Windows Presentation Foundation (WPF) dapat diluncurkan dari browser, aplikasi tersebut harus sesuai dengan serangkaian pembatasan serupa. Untuk menerapkan pembatasan ini, WPF bergantung pada Code Access Security (CAS) dan ClickOnce (lihat Strategi Keamanan WPF - Keamanan Platform). Secara default, aplikasi yang dihosting browser meminta set izin CAS zona Internet, terlepas dari apakah mereka diluncurkan dari Internet, intranet lokal, atau komputer lokal. Aplikasi yang berjalan dengan apa pun yang kurang dari sekumpulan izin lengkap dikatakan berjalan dengan kepercayaan parsial.

WPF menyediakan berbagai dukungan untuk memastikan bahwa fungsionalitas sebanyak mungkin dapat digunakan dengan aman dalam kepercayaan parsial, dan bersama dengan CAS, memberikan dukungan tambahan untuk pemrograman kepercayaan parsial.

Topik ini berisi bagian berikut:

Dukungan Kepercayaan Parsial Fitur WPF

Tabel berikut mencantumkan fitur tingkat tinggi Windows Presentation Foundation (WPF) yang aman digunakan dalam batas set izin zona Internet.

Tabel 1: Fitur WPF yang Aman dalam Kepercayaan Parsial

Area Fitur Fitur
Umum Jendela Browser

Situs Akses Asal

IsolatedStorage (Batas 512KB)

Penyedia UIAutomation

Komandan

Editor Metode Input (IMEs)

Tablet Stylus dan Tinta

Seret/Jatuhkan yang Disimulasikan menggunakan Tangkapan Mouse dan Pindahkan Peristiwa

OpenFileDialog

Deserialisasi XAML (melalui XamlReader.Load)
Integrasi Web Dialog Unduhan Browser

Navigasi yang Dimulai Pengguna Tingkat Atas

mailto:links

Parameter Pengidentifikasi Sumber Daya Seragam

HTTPWebRequest

Konten WPF Dihosting dalam IFRAME

Hosting Halaman HTML Situs Yang Sama menggunakan Bingkai

Hosting Halaman HTML Situs yang Sama menggunakan WebBrowser

Layanan Web (ASMX)

Layanan Web (menggunakan Windows Communication Foundation)

Pembuatan skrip

Model Objek Dokumen
Visual 2D dan 3D

Animasi

Media (Situs Asal dan Lintas Domain)

Pencitraan/Audio/Video
Membaca FlowDocuments

Dokumen XPS

Tertanam & Font Sistem

Font CFF & TrueType
Pengeditan Pemeriksaan Ejaan

RichTextBox

Dukungan Clipboard Teks Biasa dan Tinta

Tempel yang Dimulai Pengguna

Menyalin Isi Terpilih
Kontrol Kontrol Umum

Tabel ini mencakup fitur WPF pada tingkat tinggi. Untuk informasi lebih rinci, Windows SDK mendokuensikan izin yang diperlukan oleh setiap anggota di WPF. Selain itu, fitur berikut memiliki informasi lebih rinci mengenai eksekusi kepercayaan parsial, termasuk pertimbangan khusus.

Tabel berikut menguraikan fitur WPF yang tidak aman untuk dijalankan dalam batas set izin zona Internet.

Tabel 2: Fitur WPF yang Tidak Aman dalam Kepercayaan Parsial

Area Fitur Fitur
Umum Jendela (Windows dan Kotak Dialog yang Ditentukan Aplikasi)

SaveFileDialog

Sistem file

Akses Registri

Seret dan Lepaskan

Serialisasi XAML (melalui XamlWriter.Save)

Klien UIAutomation

Akses Jendela Sumber (HwndHost)

Dukungan Ucapan Penuh

Interoperabilitas Formulir Windows
Visual Efek Bitmap

Pengodean Gambar
Pengeditan Papan Klip Format Teks Kaya

Dukungan XAML penuh

Pemrograman Kepercayaan Parsial

Untuk aplikasi XBAP, kode yang melebihi set izin default akan memiliki perilaku yang berbeda tergantung pada zona keamanan. Dalam beberapa kasus, pengguna akan menerima peringatan ketika mereka mencoba menginstalnya. Pengguna dapat memilih untuk melanjutkan atau membatalkan penginstalan. Tabel berikut menjelaskan perilaku aplikasi untuk setiap zona keamanan dan apa yang harus Anda lakukan agar aplikasi menerima kepercayaan penuh.

Peringatan

XBAP memerlukan browser warisan untuk beroperasi, seperti Internet Explorer dan firefox versi lama. Browser lama ini biasanya tidak didukung pada Windows 10 dan Windows 11. Browser modern tidak lagi mendukung teknologi yang diperlukan untuk aplikasi XBAP karena risiko keamanan. Plugin yang mengaktifkan XBAP tidak lagi didukung. Untuk informasi selengkapnya, lihat Tanya jawab umum tentang aplikasi yang dihosting browser WPF (XBAP).

Zona Keamanan Perilaku Mendapatkan Kepercayaan Penuh
Komputer lokal Kepercayaan penuh otomatis Tidak ada tindakan yang diperlukan.
Intranet dan situs tepercaya Meminta kepercayaan penuh Tanda tangani XBAP dengan sertifikat sehingga pengguna melihat sumber dalam perintah.
Internet Gagal dengan "Kepercayaan Tidak Diberikan" Tanda tangani XBAP dengan sertifikat.

Catatan

Perilaku yang dijelaskan dalam tabel sebelumnya adalah untuk kepercayaan penuh XBAP yang tidak mengikuti model Penyebaran Tepercaya ClickOnce.

Secara umum, kode yang mungkin melebihi izin yang diizinkan kemungkinan merupakan kode umum yang dibagikan antara aplikasi mandiri dan yang dihosting browser. CAS dan WPF menawarkan beberapa teknik untuk mengelola skenario ini.

Mendeteksi Izin Menggunakan CAS

Dalam beberapa situasi, dimungkinkan bagi kode bersama dalam rakitan pustaka untuk digunakan oleh aplikasi mandiri dan XBAP. Dalam kasus ini, kode dapat menjalankan fungsionalitas yang dapat memerlukan lebih banyak izin daripada yang diizinkan oleh set izin yang diberikan aplikasi. Aplikasi Anda dapat mendeteksi apakah aplikasi tersebut memiliki izin tertentu dengan menggunakan keamanan Microsoft .NET Framework atau tidak. Secara khusus, ini dapat menguji apakah ia memiliki izin tertentu dengan memanggil Demand metode pada instans izin yang diinginkan. Ini ditunjukkan dalam contoh berikut, yang memiliki kode yang mengkueri apakah memiliki kemampuan untuk menyimpan file ke disk lokal:

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

Jika aplikasi tidak memiliki izin yang diinginkan, panggilan ke Demand akan melemparkan pengecualian keamanan. Jika tidak, izin telah diberikan. IsPermissionGranted merangkum perilaku ini dan mengembalikan true atau false sebagaimana mewajarkan.

Degradasi Fungsionalitas yang Anggun

Mampu mendeteksi apakah kode memiliki izin untuk melakukan apa yang perlu dilakukan menarik untuk kode yang dapat dijalankan dari zona yang berbeda. Meskipun mendeteksi zona adalah satu hal, jauh lebih baik untuk memberikan alternatif bagi pengguna, jika memungkinkan. Misalnya, aplikasi kepercayaan penuh biasanya memungkinkan pengguna untuk membuat file di mana saja yang mereka inginkan, sementara aplikasi kepercayaan parsial hanya dapat membuat file di penyimpanan terisolasi. Jika kode untuk membuat file ada dalam rakitan yang dibagikan oleh aplikasi kepercayaan penuh (mandiri) dan aplikasi kepercayaan parsial (yang dihosting browser), dan kedua aplikasi ingin pengguna dapat membuat file, kode bersama harus mendeteksi apakah itu berjalan dalam kepercayaan parsial atau penuh sebelum membuat file di lokasi yang sesuai. Kode berikut menunjukkan keduanya.

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

Dalam banyak kasus, Anda harus dapat menemukan alternatif kepercayaan parsial.

Dalam lingkungan terkontrol, seperti intranet, kerangka kerja terkelola kustom dapat diinstal di seluruh basis klien ke dalam cache perakitan global (GAC). Pustaka ini dapat menjalankan kode yang memerlukan kepercayaan penuh, dan direferensikan dari aplikasi yang hanya diizinkan kepercayaan parsial dengan menggunakan AllowPartiallyTrustedCallersAttribute (untuk informasi selengkapnya, lihat Strategi Keamanan dan WPF - Keamanan Platform).

Deteksi Host Browser

Menggunakan CAS untuk memeriksa izin adalah teknik yang cocok ketika Anda perlu memeriksa berdasarkan per izin. Meskipun, teknik ini tergantung pada menangkap pengecualian sebagai bagian dari pemrosesan normal, yang tidak direkomendasikan secara umum dan dapat memiliki masalah performa. Sebaliknya, jika aplikasi browser XAML (XBAP) Anda hanya berjalan dalam kotak pasir zona Internet, Anda dapat menggunakan BrowserInteropHelper.IsBrowserHosted properti , yang mengembalikan true untuk aplikasi browser XAML (XBAP).

Peringatan

XBAP memerlukan browser warisan untuk beroperasi, seperti Internet Explorer dan firefox versi lama. Browser lama ini biasanya tidak didukung pada Windows 10 dan Windows 11. Browser modern tidak lagi mendukung teknologi yang diperlukan untuk aplikasi XBAP karena risiko keamanan. Plugin yang mengaktifkan XBAP tidak lagi didukung. Untuk informasi selengkapnya, lihat Tanya jawab umum tentang aplikasi yang dihosting browser WPF (XBAP).

Catatan

IsBrowserHosted hanya membedakan apakah aplikasi berjalan di browser, bukan kumpulan izin mana yang dijalankan aplikasi.

Mengelola Izin

Secara default, XBAP berjalan dengan kepercayaan parsial (set izin zona Internet default). Namun, tergantung pada persyaratan aplikasi, dimungkinkan untuk mengubah kumpulan izin dari default. Misalnya, jika XBAP diluncurkan dari intranet lokal, XBAP dapat memanfaatkan peningkatan set izin, yang ditunjukkan dalam tabel berikut.

Peringatan

XBAP memerlukan browser warisan untuk beroperasi, seperti Internet Explorer dan firefox versi lama. Browser lama ini biasanya tidak didukung pada Windows 10 dan Windows 11. Browser modern tidak lagi mendukung teknologi yang diperlukan untuk aplikasi XBAP karena risiko keamanan. Plugin yang mengaktifkan XBAP tidak lagi didukung. Untuk informasi selengkapnya, lihat Tanya jawab umum tentang aplikasi yang dihosting browser WPF (XBAP).

Tabel 3: Izin LocalIntranet dan Internet

Izin Atribut LocalIntranet Internet
DNS Mengakses server DNS Ya Tidak
Variabel Lingkungan Read Ya Tidak
Dialog File Buka Ya Ya
Dialog File Tidak dibatasi Ya Tidak
Penyimpanan Terisolasi Isolasi perakitan oleh pengguna Ya Tidak
Penyimpanan Terisolasi Isolasi tidak diketahui Ya Ya
Penyimpanan Terisolasi Kuota pengguna tidak terbatas Ya Tidak
Media Audio, video, dan gambar yang aman Ya Ya
Pencetakan Pencetakan default Ya Tidak
Pencetakan Pencetakan aman Ya Ya
Refleksi Memancarkan Ya Tidak
Keamanan Eksekusi kode terkelola Ya Ya
Keamanan Menegaskan izin yang diberikan Ya Tidak
Antarmuka Pengguna Tidak dibatasi Ya Tidak
Antarmuka Pengguna Jendela tingkat atas aman Ya Ya
Antarmuka Pengguna Papan Klip Sendiri Ya Ya
Browser Web Navigasi bingkai aman ke HTML Ya Ya

Catatan

Potong dan Tempel hanya diperbolehkan dalam kepercayaan parsial saat pengguna memulai.

Jika Anda perlu meningkatkan izin, Anda perlu mengubah pengaturan proyek dan manifes aplikasi ClickOnce. Untuk informasi selengkapnya, lihat Gambaran umum Aplikasi browser WPF XAML. Dokumen berikut mungkin juga berguna.

Jika XBAP Anda memerlukan kepercayaan penuh, Anda dapat menggunakan alat yang sama untuk meningkatkan izin yang diminta. Meskipun XBAP hanya akan menerima kepercayaan penuh jika diinstal pada dan diluncurkan dari komputer lokal, intranet, atau dari URL yang tercantum di situs tepercaya atau yang diizinkan browser. Jika aplikasi diinstal dari intranet atau situs tepercaya, pengguna akan menerima permintaan ClickOnce standar yang memberi tahu mereka tentang izin yang ditingkatkan. Pengguna dapat memilih untuk melanjutkan atau membatalkan penginstalan.

Atau, Anda dapat menggunakan model Penyebaran Tepercaya ClickOnce untuk penyebaran kepercayaan penuh dari zona keamanan apa pun. Untuk informasi selengkapnya, lihat Gambaran Umum dan Keamanan Penyebaran Aplikasi Tepercaya.

Lihat juga