WPF Kısmi Güven Güvenliği

Genel olarak, kötü amaçlı hasarı önlemek için İnternet uygulamalarının kritik sistem kaynaklarına doğrudan erişimi kısıtlanmalıdır. Varsayılan olarak, HTML ve istemci tarafı betik dilleri kritik sistem kaynaklarına erişemez. Windows Presentation Foundation (WPF) tarayıcı tarafından barındırılan uygulamalar tarayıcıdan başlatılabildiğinden, benzer bir kısıtlama kümesine uymaları gerekir. Bu kısıtlamaları uygulamak için WPF hem Kod Erişim Güvenliği 'ne (CAS) hem de ClickOnce'a dayanır (bkz . WPF Güvenlik Stratejisi - Platform Güvenliği). Varsayılan olarak, tarayıcı tarafından barındırılan uygulamalar İnternet'ten mi, yerel intranetten mi yoksa yerel bilgisayardan mı başlatıldıklarından bağımsız olarak İnternet bölgesi CAS izin kümesini ister. Tam izin kümesinden daha azıyla çalışan uygulamaların kısmi güvenle çalıştığı söylenir.

WPF, kısmi güvende mümkün olduğunca çok işlevin güvenli bir şekilde kullanılabilmesini sağlamak için çok çeşitli destek sağlar ve CAS ile birlikte kısmi güven programlama için ek destek sağlar.

Bu konu, aşağıdaki bölümleri içerir:

WPF Özelliği Kısmi Güven Desteği

Aşağıdaki tabloda, Windows Presentation Foundation'ın (WPF) İnternet bölgesi izin kümesinin sınırları içinde kullanımı güvenli olan üst düzey özellikleri listelenmiştir.

Tablo 1: Kısmi Güvende Güvenli OLAN WPF Özellikleri

Özellik Alanı Özellik
Genel Tarayıcı Penceresi

Kaynak Sitesi Erişimi

IsolatedStorage (512 KB Sınırı)

UIAutomation Sağlayıcıları

Komuta

Giriş Yöntemi Düzenleyicileri (IME'ler)

Tablet Ekran Kalemi ve Mürekkep

Fare Yakalama ve Taşıma Olaylarını Kullanarak Sanal Sürükleme/Bırakma

OpenFileDialog

XAML Seri Durumdan Çıkarma (XamlReader.Load aracılığıyla)
Web Tümleştirmesi Tarayıcı İndirme İletişim Kutusu

Üst Düzey Kullanıcı Tarafından Başlatılan Gezinti

mailto:links

Tekdüzen Kaynak Tanımlayıcı Parametreleri

HTTPWebRequest

IFRAME'de Barındırılan WPF İçeriği

Çerçeve Kullanarak Aynı Site HTML Sayfalarını Barındırma

WebBrowser kullanarak Aynı Site HTML Sayfalarını Barındırma

Web Hizmetleri (ASMX)

Web Hizmetleri (Windows Communication Foundation kullanarak)

Komut dosyası

Belge Nesne Modeli
Görseller 2B ve 3B

Animasyon

Medya (Kaynak ve Etki Alanları Arası Site)

Görüntüleme/Ses/Video
Okunanlar FlowDocuments

XPS Belgeleri

Katıştırılmış ve Sistem Yazı Tipleri

CFF & TrueType Yazı Tipleri
Düzenleniyor Yazım Denetimi

RichTextBox

Düz Metin ve Mürekkep Panosu Desteği

Kullanıcı Tarafından Başlatılan Yapıştırma

Seçili İçeriği Kopyalama
Denetimler Genel Denetimler

Bu tablo, WPF özelliklerini üst düzeyde kapsar. Daha ayrıntılı bilgi için, Windows SDK'sı WPF'deki her üyenin gerektirdiği izinleri belgeler. Ayrıca, aşağıdaki özelliklerin kısmi güven yürütmeyle ilgili daha ayrıntılı bilgileri vardır ve özellikle dikkat edilmesi gerekenler de vardır.

Aşağıdaki tabloda, İnternet bölgesi izin kümesinin sınırları içinde çalıştırılması güvenli olmayan WPF özellikleri özetlenmiştir.

Tablo 2: Kısmi Güvende Güvenli Olmayan WPF Özellikleri

Özellik Alanı Özellik
Genel Pencere (Uygulama Tanımlı Pencereler ve İletişim Kutuları)

SaveFileDialog

Dosya Sistemi

Kayıt Defteri Erişimi

Sürükleme ve Bırakma

XAML Serileştirme (XamlWriter.Save aracılığıyla)

UIAutomation İstemcileri

Kaynak Pencere Erişimi (HwndHost)

Tam Konuşma Desteği

Windows Forms Birlikte Çalışabilirliği
Görseller Bit Eşlem Efektleri

Görüntü Kodlama
Düzenleniyor Zengin Metin Biçimi Panosu

Tam XAML desteği

Kısmi Güven Programlama

XBAP uygulamaları için, varsayılan izin kümesini aşan kod, güvenlik bölgesine bağlı olarak farklı davranışlara sahip olur. Bazı durumlarda, kullanıcı yüklemeyi denediğinde bir uyarı alır. Kullanıcı yüklemeye devam etmeyi veya yüklemeyi iptal etmeyi seçebilir. Aşağıdaki tabloda, uygulamanın her güvenlik bölgesi için davranışı ve uygulamanın tam güven alması için yapmanız gerekenler açıklanmaktadır.

Uyarı

XBAP'ler, Internet Explorer ve Firefox'un eski sürümleri gibi eski tarayıcıların çalıştırılmasını gerektirir. Bu eski tarayıcılar genellikle Windows 10 ve Windows 11'de desteklenmez. Modern tarayıcılar artık güvenlik riskleri nedeniyle XBAP uygulamaları için gereken teknolojiyi desteklemiyor. XBAP'leri etkinleştiren eklentiler artık desteklenmemektedir. Daha fazla bilgi için bkz . WPF tarayıcı tarafından barındırılan uygulamalar (XBAP) hakkında sık sorulan sorular.

Güvenlik Bölgesi Davranış Tam Güven Alma
Yerel bilgisayar Otomatik tam güven Eylem gerekmiyor.
İntranet ve güvenilen siteler Tam güven iste Kullanıcının isteminde kaynağı görmesi için XBAP'yi bir sertifikayla imzalayın.
İnternet "Güven Verilmedi" ile başarısız oluyor XBAP'yi bir sertifikayla imzalayın.

Not

Önceki tabloda açıklanan davranış, ClickOnce Güvenilen Dağıtım modelini izlemeyen tam güven XBAP'leri içindir.

Genel olarak, izin verilen izinleri aşabilecek kod, hem tek başına hem de tarayıcıda barındırılan uygulamalar arasında paylaşılan yaygın kod olabilir. CAS ve WPF, bu senaryoyı yönetmek için çeşitli teknikler sunar.

CAS Kullanarak İzinleri Algılama

Bazı durumlarda, kitaplık derlemelerindeki paylaşılan kodun hem tek başına uygulamalar hem de XBAP'ler tarafından kullanılması mümkündür. Bu durumlarda kod, uygulamanın verilen izin kümesinin izin verdiğinden daha fazla izin gerektirebilecek işlevleri yürütebilir. Uygulamanız, Microsoft .NET Framework güvenliğini kullanarak belirli bir izne sahip olup olmadığını algılayabilir. Özellikle, istenen iznin örneğinde yöntemini çağırarak Demand belirli bir izne sahip olup olmadığını test edebilir. Bu, bir dosyayı yerel diske kaydedip kaydetmediğini sorgulayan kodun bulunduğu aşağıdaki örnekte gösterilmiştir:

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

Bir uygulama istenen izne sahip değilse çağrısı Demand bir güvenlik özel durumu oluşturur. Aksi takdirde, izin verilmiştir. IsPermissionGrantedbu davranışı kapsüller ve veya false uygun şekilde döndürürtrue.

İşlevselliği Düzgün Bir Şekilde Düşürme

Kodun yapması gereken işlemi yapma iznine sahip olup olmadığını algılamak, farklı bölgelerden yürütülebilen kodlar için ilginçtir. Bölgeyi algılamak bir şey olsa da, mümkünse kullanıcıya bir alternatif sağlamak çok daha iyidir. Örneğin, tam güven uygulaması genellikle kullanıcıların istedikleri yerde dosya oluşturmasına olanak tanırken, kısmi güven uygulaması yalnızca yalıtılmış depolamada dosya oluşturabilir. Dosya oluşturma kodu hem tam güven (tek başına) uygulamaları hem de kısmi güven (tarayıcı tarafından barındırılan) uygulamalar tarafından paylaşılan bir derlemede varsa ve her iki uygulama da kullanıcıların dosya oluşturabilmesini istiyorsa, paylaşılan kod uygun konumda bir dosya oluşturmadan önce dosyanın kısmi veya tam güven içinde çalışıp çalışmadığını algılamalıdır. Aşağıdaki kod her ikisini de gösterir.

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

Çoğu durumda kısmi bir güven alternatifi bulabilmeniz gerekir.

İntranet gibi denetimli bir ortamda, istemci tabanında genel derleme önbelleğine (GAC) özel yönetilen çerçeveler yüklenebilir. Bu kitaplıklar tam güven gerektiren kod yürütebilir ve kullanarak AllowPartiallyTrustedCallersAttribute yalnızca kısmi güvene izin verilen uygulamalardan başvurulabilir (daha fazla bilgi için bkz . Güvenlik ve WPF Güvenlik Stratejisi - Platform Güvenliği).

Tarayıcı Ana Bilgisayar Algılama

İzinleri denetlemek için CAS kullanmak, izin başına denetlemeniz gerektiğinde uygun bir tekniktir. Ancak bu teknik, genel olarak önerilmez ve performans sorunlarına neden olabilecek normal işlemenin bir parçası olarak özel durumları yakalamaya bağlıdır. Bunun yerine, XAML tarayıcı uygulamanız (XBAP) yalnızca İnternet bölgesi korumalı alanında çalışıyorsa, XAML tarayıcı uygulamaları (XBAP) için true değerini döndüren özelliğini kullanabilirsiniz BrowserInteropHelper.IsBrowserHosted .

Uyarı

XBAP'ler, Internet Explorer ve Firefox'un eski sürümleri gibi eski tarayıcıların çalıştırılmasını gerektirir. Bu eski tarayıcılar genellikle Windows 10 ve Windows 11'de desteklenmez. Modern tarayıcılar artık güvenlik riskleri nedeniyle XBAP uygulamaları için gereken teknolojiyi desteklemiyor. XBAP'leri etkinleştiren eklentiler artık desteklenmemektedir. Daha fazla bilgi için bkz . WPF tarayıcı tarafından barındırılan uygulamalar (XBAP) hakkında sık sorulan sorular.

Not

IsBrowserHosted yalnızca bir uygulamanın çalıştığı izin kümesini değil, tarayıcıda çalışıp çalışmadığını ayırt eder.

İzinleri Yönetme

Varsayılan olarak, XBAP'ler kısmi güvenle (varsayılan İnternet bölgesi izin kümesi) çalışır. Ancak, uygulamanın gereksinimlerine bağlı olarak, izin kümesini varsayılandan değiştirmek mümkündür. Örneğin, yerel intranetten bir XBAP başlatılırsa, aşağıdaki tabloda gösterilen artırılmış izin kümesinden yararlanabilir.

Uyarı

XBAP'ler, Internet Explorer ve Firefox'un eski sürümleri gibi eski tarayıcıların çalıştırılmasını gerektirir. Bu eski tarayıcılar genellikle Windows 10 ve Windows 11'de desteklenmez. Modern tarayıcılar artık güvenlik riskleri nedeniyle XBAP uygulamaları için gereken teknolojiyi desteklemiyor. XBAP'leri etkinleştiren eklentiler artık desteklenmemektedir. Daha fazla bilgi için bkz . WPF tarayıcı tarafından barındırılan uygulamalar (XBAP) hakkında sık sorulan sorular.

Tablo 3: LocalIntranet ve İnternet İzinleri

İzin Öznitelik LocalIntranet İnternet
DNS DNS sunucularına erişme Yes Hayır
Ortam Değişkenleri Okundu Yes Hayır
Dosya İletişim Kutuları Açılış Yes Yes
Dosya İletişim Kutuları Sınırsız Yes Hayır
Yalıtılmış Depolama Kullanıcıya göre derleme yalıtımı Yes Hayır
Yalıtılmış Depolama Bilinmeyen yalıtım Yes Yes
Yalıtılmış Depolama Sınırsız kullanıcı kotası Yes Hayır
Medya Güvenli ses, video ve görüntüler Yes Yes
Yazdırma Varsayılan yazdırma Yes Hayır
Yazdırma Güvenli yazdırma Yes Yes
Yansıma Emit Yes Hayır
Güvenlik Yönetilen kod yürütme Yes Evet
Güvenlik Onay verilen izinler Yes Hayır
Kullanıcı Arabirimi Sınırsız Yes Hayır
Kullanıcı Arabirimi Güvenli üst düzey pencereler Yes Yes
Kullanıcı Arabirimi Kendi Panosu Yes Yes
Web Tarayıcısı HTML'ye güvenli çerçeve gezintisi Yes Evet

Not

Kes ve Yapıştır'a yalnızca kullanıcı başlatıldığında kısmi güvende izin verilir.

İzinleri artırmanız gerekiyorsa, proje ayarlarını ve ClickOnce uygulama bildirimini değiştirmeniz gerekir. Daha fazla bilgi için bkz . WPF XAML Tarayıcı Uygulamalarına Genel Bakış. Aşağıdaki belgeler de yararlı olabilir.

XBAP'niz tam güven gerektiriyorsa, istenen izinleri artırmak için aynı araçları kullanabilirsiniz. Bir XBAP yalnızca yerel bilgisayarda, intranette veya tarayıcının güvenilen veya izin verilen sitelerinde listelenen bir URL'de yüklü ve başlatılmışsa tam güven alır. Uygulama intranetten veya güvenilen bir siteden yüklenirse, kullanıcı yükseltilmiş izinleri bildiren standart ClickOnce istemini alır. Kullanıcı yüklemeye devam etmeyi veya yüklemeyi iptal etmeyi seçebilir.

Alternatif olarak, herhangi bir güvenlik bölgesinden tam güven dağıtımı için ClickOnce Güvenilen Dağıtım modelini kullanabilirsiniz. Daha fazla bilgi için bkz . Güvenilen Uygulama Dağıtımına Genel Bakış ve Güvenlik.

Ayrıca bkz.