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.
XAML (lihat XAML di WPF).
Popup (lihat System.Windows.Controls.Primitives.Popup).
Seret dan Letakkan (lihat Gambaran Umum Seret dan Letakkan).
Clipboard (lihat System.Windows.Clipboard).
Pencitraan (lihat System.Windows.Controls.Image).
Serialisasi (lihat XamlReader.Load, XamlWriter.Save).
Buka Kotak Dialog File (lihat Microsoft.Win32.OpenFileDialog).
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
.NET Desktop feedback