Částečné zabezpečení důvěryhodnosti WPF

Obecně platí, že internetové aplikace by měly být omezené na přímý přístup k důležitým systémovým prostředkům, aby se zabránilo škodlivým škodám. Skriptovací jazyky html a klientské strany ve výchozím nastavení nemají přístup k důležitým systémovým prostředkům. Vzhledem k tomu, že aplikace hostované v prohlížeči windows Presentation Foundation (WPF) je možné spustit z prohlížeče, měly by odpovídat podobné sadě omezení. Pokud chcete tato omezení vynutit, WPF spoléhá na zabezpečení přístupu kódu (CAS) i ClickOnce (viz strategie zabezpečení WPF – Zabezpečení platformy). Aplikace hostované v prohlížeči ve výchozím nastavení požadují sadu oprávnění CAS internetové zóny bez ohledu na to, jestli jsou spouštěné z internetu, místního intranetu nebo místního počítače. U aplikací, které běží s čímkoli menším, než je úplná sada oprávnění, se říká, že běží s částečným vztahem důvěryhodnosti.

WPF poskytuje širokou škálu podpory, aby se zajistilo, že co nejvíce funkcí lze bezpečně používat v částečné důvěryhodnosti a společně s CAS poskytuje další podporu pro programování částečné důvěryhodnosti.

Toto téma obsahuje následující části:

Podpora částečné důvěryhodnosti funkce WPF

V následující tabulce jsou uvedeny základní funkce windows Presentation Foundation (WPF), které jsou bezpečné pro použití v mezích sady oprávnění zóny internetu.

Tabulka 1: Funkce WPF, které jsou v částečném vztahu důvěryhodnosti bezpečné

Oblast funkcí Funkce
OBECNÉ Okno prohlížeče

Přístup k webu původu

Izolované úložiště (limit 512 kB)

Zprostředkovatelé UIAutomation

Velící

Editory IME

Pero pro tablet a rukopis

Simulované přetažení pomocí funkce Zachytávání myší a přesouvání událostí

OpenFileDialog

Deserializace XAML (přes XamlReader.Load)
Integrace webu Dialogové okno Stažení prohlížeče

Navigace iniciovaná uživatelem nejvyšší úrovně

mailto:links

Parametry identifikátoru uniform resource

HTTPWebRequest

Obsah WPF hostovaný v prvku IFRAME

Hostování stránek HTML stejného webu pomocí rámce

Hostování stejných stránek HTML webu pomocí WebBrowser

Webové služby (ASMX)

Webové služby (pomocí windows Communication Foundation)

Skriptování

Model objektu dokumentu
Vizuální prvky 2D a 3D

Animace

Média (lokalita původu a mezi doménou)

Vytváření obrázků, zvuku nebo videa
Čtení FlowDocuments

Dokumenty XPS

Vložená a systémová písma

Písma CFF a TrueType
Probíhají úpravy Kontrolu pravopisu

RichTextBox

Podpora prostého textu a schránky rukopisu

Vložení iniciované uživatelem

Kopírování vybraného obsahu
Ovládací prvky Obecné ovládací prvky

Tato tabulka popisuje funkce WPF na vysoké úrovni. Podrobnější informace jsou v sadě Windows SDK dokumentovány oprávnění vyžadovaná jednotlivými členy WPF. Kromě toho následující funkce obsahují podrobnější informace týkající se částečného spuštění důvěryhodnosti, včetně zvláštních aspektů.

Následující tabulka popisuje funkce WPF, které nejsou bezpečné pro spuštění v mezích sady oprávnění zóny Internetu.

Tabulka 2: Funkce WPF, které nejsou v částečném vztahu důvěryhodnosti bezpečné

Oblast funkcí Funkce
OBECNÉ Okno (okna definovaná aplikací a dialogová okna)

SaveFileDialog

Systém souborů

Přístup k registru

Přetažení

Serializace XAML (prostřednictvím XamlWriter.Save)

Klienti UIAutomation

Zdrojový přístup k oknem (HwndHost)

Podpora full speech

Interoperabilita model Windows Forms
Vizuální prvky Bitmapové efekty

Kódování obrázků
Probíhají úpravy Schránka ve formátu RTF

Úplná podpora XAML

Programování částečné důvěryhodnosti

U aplikací XBAP bude kód, který překračuje výchozí sadu oprávnění, mít jiné chování v závislosti na zóně zabezpečení. V některých případech se uživateli při pokusu o instalaci zobrazí upozornění. Uživatel může pokračovat nebo zrušit instalaci. Následující tabulka popisuje chování aplikace pro každou zónu zabezpečení a to, co musíte udělat, aby aplikace získala úplný vztah důvěryhodnosti.

Upozorňující

XBAPs vyžadují, aby fungovaly starší prohlížeče, jako je Internet Explorer a starší verze Firefoxu. Tyto starší prohlížeče jsou obvykle nepodporované ve Windows 10 a Windows 11. Moderní prohlížeče už kvůli rizikům zabezpečení nepodporují technologii potřebnou pro aplikace XBAP. Moduly plug-in, které umožňují XBAPs, se už nepodporují. Další informace najdete v tématu Nejčastější dotazy k aplikacím hostovaným v prohlížeči WPF (XBAP).

Zóna zabezpečení Chování Získání úplného vztahu důvěryhodnosti
Místní počítač Automatický úplný vztah důvěryhodnosti Nevyžaduje se žádná akce.
Intranetové a důvěryhodné weby Výzva k úplnému důvěryhodnosti Podepište XBAP certifikátem, aby se uživateli zobrazil zdroj na příkazovém řádku.
Internet Selhání s chybou "Vztah důvěryhodnosti není udělen" Podepište XBAP certifikátem.

Poznámka:

Chování popsané v předchozí tabulce je určené pro plně důvěryhodné XBAPs, které nedodržují model důvěryhodného nasazení ClickOnce.

Obecně platí, že kód, který může překročit povolená oprávnění, bude pravděpodobně běžným kódem sdíleným mezi samostatnými aplikacemi i aplikacemi hostovanými v prohlížeči. CAS a WPF nabízejí několik technik pro správu tohoto scénáře.

Zjišťování oprávnění pomocí CAS

V některých situacích je možné sdílený kód v sestaveních knihovny používat jak samostatné aplikace, tak XBAPs. V těchto případech může kód spouštět funkce, které by mohly vyžadovat více oprávnění, než umožňuje sada udělených oprávnění aplikace. Vaše aplikace dokáže zjistit, jestli má určité oprávnění, pomocí zabezpečení rozhraní Microsoft .NET Framework. Konkrétně může otestovat, zda má konkrétní oprávnění voláním Demand metody na instanci požadovaného oprávnění. To je znázorněno v následujícím příkladu, který obsahuje kód, který se dotazuje na to, jestli má možnost uložit soubor na místní 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

Pokud aplikace nemá požadované oprávnění, volání Demand vyvolá výjimku zabezpečení. V opačném případě se oprávnění udělilo. IsPermissionGranted zapouzdřuje toto chování a podle potřeby vrací true nebo false vrací.

Řádné snížení funkčnosti

Schopnost zjistit, jestli má kód oprávnění k provádění toho, co je potřeba udělat, je zajímavé pro kód, který se dá spustit z různých zón. Při zjišťování zóny je jedna věc, je mnohem lepší poskytnout uživateli alternativu, pokud je to možné. Například aplikace s úplným vztahem důvěryhodnosti obvykle umožňuje uživatelům vytvářet soubory kdekoli, kde chtějí, zatímco aplikace s částečnou důvěryhodností může vytvářet pouze soubory v izolovaném úložišti. Pokud kód pro vytvoření souboru existuje v sestavení sdíleném aplikacemi s úplným vztahem důvěryhodnosti (samostatnými) aplikacemi i částečným vztahem důvěryhodnosti (hostované prohlížečem) a obě aplikace chtějí, aby uživatelé mohli vytvářet soubory, měl by sdílený kód před vytvořením souboru v příslušném umístění zjistit, jestli je spuštěný v částečném nebo úplném vztahu důvěryhodnosti. Následující kód ukazuje obojí.

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

V mnoha případech byste měli být schopni najít alternativu částečné důvěryhodnosti.

V řízeném prostředí, jako je intranet, je možné do globální mezipaměti sestavení (GAC) nainstalovat vlastní spravované architektury napříč klientskou základnou. Tyto knihovny mohou spouštět kód, který vyžaduje úplný vztah důvěryhodnosti, a odkazovat na aplikace, které jsou povoleny pouze částečné důvěryhodnosti pomocí (AllowPartiallyTrustedCallersAttributedalší informace najdete v tématu Strategie zabezpečení a ZABEZPEČENÍ WPF – Zabezpečení platformy).

Detekce hostitele prohlížeče

Použití CAS ke kontrole oprávnění je vhodná technika, když potřebujete zkontrolovat jednotlivé oprávnění. I když tato technika závisí na zachytávání výjimek v rámci normálního zpracování, které se obecně nedoporučuje a může mít problémy s výkonem. Místo toho, pokud se vaše aplikace prohlížeče XAML (XBAP) spouští jenom v sandboxu internetové zóny, můžete použít BrowserInteropHelper.IsBrowserHosted vlastnost, která vrátí hodnotu true pro aplikace prohlížeče XAML (XBAPs).

Upozorňující

XBAPs vyžadují, aby fungovaly starší prohlížeče, jako je Internet Explorer a starší verze Firefoxu. Tyto starší prohlížeče jsou obvykle nepodporované ve Windows 10 a Windows 11. Moderní prohlížeče už kvůli rizikům zabezpečení nepodporují technologii potřebnou pro aplikace XBAP. Moduly plug-in, které umožňují XBAPs, se už nepodporují. Další informace najdete v tématu Nejčastější dotazy k aplikacím hostovaným v prohlížeči WPF (XBAP).

Poznámka:

IsBrowserHosted Rozlišuje pouze to, jestli je aplikace spuštěná v prohlížeči, a nikoli to, se kterou sadou oprávnění aplikace běží.

Správa oprávnění

Ve výchozím nastavení se XBAPs spouští s částečným vztahem důvěryhodnosti (výchozí sada oprávnění zóny Internetu). V závislosti na požadavcích aplikace je však možné změnit sadu oprávnění z výchozího nastavení. Pokud se například z místního intranetu spustí XBAPs, může využít zvýšenou sadu oprávnění, která je znázorněna v následující tabulce.

Upozorňující

XBAPs vyžadují, aby fungovaly starší prohlížeče, jako je Internet Explorer a starší verze Firefoxu. Tyto starší prohlížeče jsou obvykle nepodporované ve Windows 10 a Windows 11. Moderní prohlížeče už kvůli rizikům zabezpečení nepodporují technologii potřebnou pro aplikace XBAP. Moduly plug-in, které umožňují XBAPs, se už nepodporují. Další informace najdete v tématu Nejčastější dotazy k aplikacím hostovaným v prohlížeči WPF (XBAP).

Tabulka 3: Oprávnění LocalIntranet a Internet

Oprávnění Atribut LocalIntranet Internet
DNS Přístup k serverům DNS Yes No
Proměnné prostředí Čteno Yes No
Dialogy souborů Otevření Ano Yes
Dialogy souborů Neomezené Yes No
Izolované úložiště Izolace sestavení podle uživatele Yes No
Izolované úložiště Neznámá izolace Ano Yes
Izolované úložiště Neomezená kvóta uživatelů Yes No
Média Bezpečný zvuk, video a obrázky Ano Yes
Tisk Výchozí tisk Yes No
Tisk Bezpečný tisk Ano Yes
Reflexe Emitovat Yes Ne
Zabezpečení Spouštění spravovaného kódu Ano Ano
Zabezpečení Uplatnění udělených oprávnění Yes No
Uživatelské rozhraní Neomezené Yes No
Uživatelské rozhraní Bezpečná okna nejvyšší úrovně Ano Yes
Uživatelské rozhraní Vlastní schránka Ano Yes
Webový prohlížeč Bezpečná navigace s rámečkem do HTML Ano Ano

Poznámka:

Vyjmutí a vložení je povoleno pouze v částečné důvěryhodnosti při zahájení uživatele.

Pokud potřebujete zvýšit oprávnění, musíte změnit nastavení projektu a manifest aplikace ClickOnce. Další informace naleznete v tématu WPF XAML Browser Applications Overview. Můžou být užitečné i následující dokumenty.

Pokud váš XBAP vyžaduje úplný vztah důvěryhodnosti, můžete pomocí stejných nástrojů zvýšit požadovaná oprávnění. I když XBAP obdrží úplný vztah důvěryhodnosti pouze v případě, že je nainstalovaný a spuštěný z místního počítače, intranetu nebo adresy URL uvedené v důvěryhodných nebo povolených webech prohlížeče. Pokud je aplikace nainstalovaná z intranetu nebo důvěryhodného webu, obdrží uživatel standardní výzvu ClickOnce s upozorněním na zvýšená oprávnění. Uživatel může pokračovat nebo zrušit instalaci.

Alternativně můžete použít model důvěryhodného nasazení ClickOnce pro úplné nasazení důvěryhodnosti z jakékoli zóny zabezpečení. Další informace najdete v tématu Přehled a zabezpečení nasazení důvěryhodných aplikací.

Viz také