Sdílet prostřednictvím


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

Obecně platí, že internetové aplikace by neměly mít přímý přístup k důležitým systémovým prostředkům, aby se zabránilo škodlivým poškození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í. K vynucení těchto omezení spoléhá WPF na zabezpečení přístupu kódu (CAS) i ClickOnce (viz strategie zabezpečení – zabezpečení platformy pro WPF). 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čnou důvěryhodností.

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é důvěryhodnosti bezpečné

Oblast funkcí Funkce
Obecné Okno prohlížeče

Přístup k původnímu webu

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

Zprostředkovatelé UIAutomation

Velící

Editory vstupních metod (IMEs)

Stylus pro tablet a inkoust

Simulované přetažení využitím zachycení myši a události pohybu

OpenFileDialog

Deserializace XAML (přes XamlReader.Load)
Integrace webu Dialog pro stahování v prohlížeči

Navigace Top-Level User-Initiated

mailto: odkazy

Parametry identifikátoru jednotného zdroje

HTTPWebRequest

Obsah WPF hostovaný v rámci IFRAME

Hostování stránek HTML Same-Site pomocí frameu

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ály 2D a 3D

Animace

Média (původní místo a mezi doménami)

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

Dokumenty XPS

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

CFF & Písma TrueType
Editace Kontrolu pravopisu

RichTextBox

Podpora prostého textu a schránky inkoustu

User-Initiated Vložit

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

Tato tabulka popisuje funkce WPF na vysoké úrovni. Pro podrobnější informace dokumentuje sada Windows SDK oprávnění vyžadovaná jednotlivými členy WPF. Kromě toho následující funkcionality obsahují podrobnější informace pro částečné spuštění v důvěryhodném režimu, včetně zvláštních úvah.

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 bezpečné v částečné důvěryhodnosti

Oblast funkcí Funkce
Obecné Okno (okna definovaná aplikací a dialogová okna)

Dialog pro uložení souboru

Systém souborů

Přístup k registru

Přetáhnout a pustit

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

Klienti UIAutomation

Zdrojový přístup k oknem (HwndHost)

Plná podpora řeči

Interoperabilita Windows Forms
Vizualizace Rastrové efekty

Kódování obrázků
Editace Schránka pro formát 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.

Varování

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é důvěry
Místní počítač Automatická úplná důvěra Není potřeba žádná akce.
Intranetové a důvěryhodné weby Výzva k úplné důvěře Podepište XBAP certifikátem, aby se uživateli zobrazil zdroj na příkazovém řádku.
Internet Selhání s chybou "Důvěra není udělena" 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é, aby sdílený kód v knihovních sestaveních používaly jak samostatné aplikace, tak i 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 metody Demand 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í. Jinak bylo oprávnění uděleno. IsPermissionGranted toto chování zapouzdřuje a podle potřeby vrací true nebo false.

Řá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. Zjištění zóny je jedna věc, ale je mnohem lepší poskytnout 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 plnou důvěru, a být odkazovány aplikacemi, které mají povolenu pouze částečnou důvěru pomocí AllowPartiallyTrustedCallersAttribute (další informace najdete v tématu Security a WPF Security Strategy - Platform Security).

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í pouze v sandboxu internetové zóny, můžete použít vlastnost BrowserInteropHelper.IsBrowserHosted, která vrací hodnotu true pro aplikace prohlížeče XAML (XBAPs).

Varování

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 ne na tom, s jakou sadou oprávnění aplikace běží.

Správa oprávnění

Ve výchozím nastavení se XBAPs spouští s částečnou důvěryhodností (výchozí sada oprávnění pro zónu 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.

Varování

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

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

Poznámka

Vyjmutí a vložení je povoleno pouze v omezené důvěryhodnosti, pokud je zahájeno uživatelem.

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 plnou důvěru, můžete ke zvýšení požadovaných oprávnění použít stejné nástroje. I když XBAP obdrží úplnou důvěru pouze v případě, že je nainstalovaný a spuštěný z místního počítače, intranetu, nebo z adresy URL, která je uvedena v seznamu důvěryhodných nebo povolených webů 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 nasazení ClickOnce s plnou důvěrou z jakékoli zóny zabezpečení. Další informace naleznete v tématu Přehled nasazení důvěryhodných aplikací a Zabezpečení.

Viz také