Čá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ů.
XAML (viz XAML ve WPF).
Automaticky otevírané okno (viz System.Windows.Controls.Primitives.Popup).
Přetažení (viz Přehled přetažení).
Schránka (viz System.Windows.Clipboard).
Imaging (viz System.Windows.Controls.Image).
Serializace (viz XamlReader.Load, XamlWriter.Save).
Dialogové okno Otevřít soubor (viz Microsoft.Win32.OpenFileDialog).
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.
MageUI.exe (nástroj pro generování a úpravy manifestu, grafický klient)
Zabezpečení aplikací ClickOnce
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é
.NET Desktop feedback