Aracılığıyla paylaş


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.

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.

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

Uyarı

Kod Erişim Güvenliği (CAS) modern .NET tarafından desteklenmez, yalnızca .NET Framework kavramıdır. CAS ile ilgili tüm işlevler tam güven varsayımı altında ele alır. Daha fazla bilgi için bkz. WPF .NET ile Farklılıklar - Kod Erişim Güvenliğ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

Menşei Siteye Erişim

IsolatedStorage (512 KB Sınırı)

UIAutomation Sağlayıcıları

Komuta etme

Giriş Yöntemi Düzenleyicileri (IMI'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 Penceresi

Top-Level User-Initiated Navigasyon

mailto: bağlantılar

Tekdüzen Kaynak Tanımlayıcı Parametreleri

HTTPWebRequest

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

Çerçeve Kullanarak Same-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)

Betik Yazma

Belge Nesne Modeli (DOM)
Görsel 2D ve 3D

Animasyon

Medya (Kaynak Site ve Alanlar Arası)

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

XPS Belgeleri

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

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

RichTextBox

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

User-Initiated Yapıştır

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ı)

DosyaKaydetmeDiyalog

Dosya Sistemi

Kayıt Defteri Erişimi

Sürükle ve Bırak

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örsel Bit Eşlem Efektleri

Görüntü Kodlama
Düzenleme 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 gerekmez.
İntranet ve güvenilen siteler Tam güvenlik onayı 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.

Uyarı

Ö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 olarak, istenen iznin örneği üzerinde Demand metodunu çağırarak 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, Demand çağrısı bir güvenlik istisnası oluşturur. Aksi takdirde, izin verilmiştir. IsPermissionGranted bu davranışı kapsüller ve uygun olduğunda true veya false'yi döndürür.

İşlevselliğin Kademeli Zayıflaması

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ı Sunucu Algılama

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

Uyarı

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 Özellik LocalIntranet İnternet
Alan Adı Sistemi (DNS) DNS sunucularına erişme Evet Hayı
Ortam Değişkenleri Okumak Evet Hayı
Dosya İletişim Kutuları Açık Evet Evet
Dosya İletişim Kutuları Sınırsız Evet Hayı
Yalıtılmış Depolama Kullanıcıya göre derleme yalıtımı Evet Hayı
Yalıtılmış Depolama Bilinmeyen izolasyon Evet Evet
Yalıtılmış Depolama Sınırsız kullanıcı kotası Evet Hayı
Medya Güvenli ses, video ve görüntüler Evet Evet
Baskı Varsayılan yazdırma Evet Hayı
Baskı Güvenli yazdırma Evet Evet
Yansıma Emit Evet Hayı
Güvenlik Yönetilen kod yürütme Evet Evet
Güvenlik Tanınmış izinleri doğrula Evet Hayı
Kullanıcı Arayüzü Sınırsız Evet Hayı
Kullanıcı Arayüzü Güvenli üst düzey pencereler Evet Evet
Kullanıcı Arayüzü Kendi Panosu Evet Evet
Web tarayıcısı HTML'ye güvenli çerçeve gezintisi Evet Evet

Uyarı

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 bilgisayara veya intranete yüklendiğinde ve oradan başlatıldığında ya da tarayıcının güvenilen veya izin verilen sitelerinde listelenen bir URL'den başlatıldığında tam güven verir. 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 bakınız