Čá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.
XAML (viz XAML ve WPF).
Automaticky otevírané okna (viz System.Windows.Controls.Primitives.Popup).
Přetažení (viz Přehled přetažení).
Schránka (viz System.Windows.Clipboard).
Zobrazování (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 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é
- zabezpečení
- Strategie zabezpečení WPF - Zabezpečení platformy
- strategie zabezpečení WPF – přípravy zabezpečení
.NET Desktop feedback