Dela via


WPF Partiell förtroendesäkerhet

I allmänhet bör Internetprogram begränsas från att ha direkt åtkomst till kritiska systemresurser för att förhindra skadliga skador. Som standard kan skriptspråk på HTML- och klientsidan inte komma åt kritiska systemresurser. Eftersom windows Presentation Foundation-program (WPF) kan startas från webbläsaren bör de följa en liknande uppsättning begränsningar. För att tillämpa dessa begränsningar förlitar sig WPF på både Code Access Security (CAS) och ClickOnce (se WPF-säkerhetsstrategi – Plattformssäkerhet). Som standardinställning begär webbläsarprogram behörighetsuppsättningen CAS för zonen Internet, oavsett om de startas från Internet, ett lokalt intranät eller en lokal dator. Program som körs med något mindre än den fullständiga uppsättningen behörigheter sägs köras med partiellt förtroende.

Varning

XBAP:er kräver att äldre webbläsare används, till exempel Internet Explorer och gamla versioner av Firefox. Dessa äldre webbläsare stöds vanligtvis inte i Windows 10 och Windows 11. Moderna webbläsare stöder inte längre den teknik som krävs för XBAP-appar på grund av säkerhetsrisker. Plugin-program som aktiverar XBAP:er stöds inte längre. Mer information finns i Vanliga frågor och svar om WPF-webbläsarbaserade program (XBAP).

WPF ger en mängd olika stöd för att säkerställa att så mycket funktionalitet som möjligt kan användas på ett säkert sätt i partiellt förtroende, och tillsammans med CAS, ger ytterligare stöd för partiell förtroendeprogrammering.

Det här avsnittet innehåller följande avsnitt:

Stöd för partiellt förtroende för WPF-funktioner

Varning

Code Access Security (CAS) stöds inte av modern .NET, det är ett .NET Framework-begrepp. Alla CAS-relaterade funktioner behandlas under antagandet om fullständigt förtroende. Mer information finns i Skillnader med WPF .NET – Kodåtkomstsäkerhet.

I följande tabell visas de högnivåfunktioner i Windows Presentation Foundation (WPF) som är säkra att använda inom gränserna för behörighetsuppsättningen i zonen Internet.

Tabell 1: WPF-funktioner som är säkra i partiellt förtroende

Funktionsområde Egenskap
Allmänt Webbläsarfönster

Åtkomst till webbplatsens ursprung

IsolatedStorage (512 KB-gräns)

UIAutomation-leverantörer

Bestämmande

Indatametodredigerare (IME)

Styluspenna och bläck för surfplattor

Simulerad dra/släpp med hjälp av musavbildnings- och flytthändelser

OpenFileDialog

XAML-deserialisering (via XamlReader.Load)
Webbintegrering Dialogruta för nedladdning av webbläsare

Top-Level User-Initiated navigering

mailto:länkar

Parametrar för enhetlig resursidentifierare

HTTPWebRequest

WPF-innehåll som finns i en IFRAME

Hosting av Same-Site HTML-sidor med ramteknik

Hosta HTML-sidor inom samma domänområde med webbläsare

Webbtjänster (ASMX)

Webbtjänster (med Hjälp av Windows Communication Foundation)

Skriptskrivning

Dokumentobjektmodell
Bildmaterial 2D och 3D

Animation

Media (ursprungsplats och tvärdomän)

Bildbehandling/Audio/Video
Läsning FlowDocuments

XPS-dokument

Inbäddade och systemteckensnitt

CFF- och TrueType-teckensnitt
Redigering Stavningskontroll

RikTextBox

Stöd för Klartext och Pennanteckning

User-Initiated Klistra in

Kopiera valt innehåll
Kontroller Allmänna kontroller

Den här tabellen beskriver WPF-funktionerna på en hög nivå. För mer detaljerad information dokumenterar Windows SDK de behörigheter som krävs av varje medlem i WPF. Dessutom har följande funktioner mer detaljerad information om körning med begränsat förtroende, inklusive speciella hänsyn.

I följande tabell beskrivs WPF-funktioner som inte är säkra att köra inom gränserna för behörighetsuppsättningen i zonen Internet.

Tabell 2: WPF-funktioner som inte är säkra i partiellt förtroende

Funktionsområde Egenskap
Allmänt Fönster (programdefinierade Fönster och dialogrutor)

SaveFileDialog

Filsystem

Registeråtkomst

Dra och släpp

XAML-serialisering (via XamlWriter.Save)

UIAutomation-klienter

Åtkomst till källfönster (HwndHost)

Fullständigt talstöd

Samverkan mellan Windows Forms
Bildmaterial Bitmappseffekter

Bildkodning
Redigering RTF-format Urklipp

Fullständigt XAML-stöd

Partiell förtroendeprogrammering

För XBAP-program har kod som överskrider standardbehörighetsuppsättningen olika beteende beroende på säkerhetszonen. I vissa fall får användaren en varning när de försöker installera den. Användaren kan välja att fortsätta eller avbryta installationen. I följande tabell beskrivs programmets beteende för varje säkerhetszon och vad du måste göra för att programmet ska få fullständigt förtroende.

Varning

XBAP:er kräver att äldre webbläsare används, till exempel Internet Explorer och gamla versioner av Firefox. Dessa äldre webbläsare stöds vanligtvis inte i Windows 10 och Windows 11. Moderna webbläsare stöder inte längre den teknik som krävs för XBAP-appar på grund av säkerhetsrisker. Plugin-program som aktiverar XBAP:er stöds inte längre. Mer information finns i Vanliga frågor och svar om WPF-webbläsarbaserade program (XBAP).

Säkerhetszon Beteende Få fullständigt förtroende
Lokal dator Automatiskt fullständigt förtroende Ingen åtgärd krävs.
Intranät och betrodda platser Uppmaning om fullt förtroende Signera XBAP med ett certifikat så att användaren ser källan i prompten.
Internet Misslyckas med "Förtroende har inte beviljats" Signera XBAP med ett certifikat.

Anmärkning

Det beteende som beskrivs i föregående tabell är för fullständigt betrodda XBAP:er som inte följer clickOnce-modellen för betrodd distribution.

I allmänhet är kod som kan överskrida de tillåtna behörigheterna sannolikt vanlig kod som delas mellan både fristående program och webbläsarbaserade program. CAS och WPF erbjuder flera tekniker för att hantera det här scenariot.

Identifiera behörigheter med hjälp av CAS

I vissa situationer är det möjligt att delad kod i bibliotekssammansättningar används av både fristående program och XBAP:er. I dessa fall kan kod köra funktioner som kan kräva fler behörigheter än vad programmets tilldelade behörighetsuppsättning tillåter. Ditt program kan identifiera om det har en viss behörighet med hjälp av Microsoft .NET Framework-säkerhet. Mer specifikt kan den testa om den har en specifik behörighet genom att anropa Demand metoden på instansen av den önskade behörigheten. Detta visas i följande exempel, som har kod som frågar efter om den har möjlighet att spara en fil på den lokala disken:

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

Om ett program inte har önskad behörighet utlöser anropet till Demand ett säkerhetsfel. Annars har behörigheten beviljats. IsPermissionGranted kapslar in det här beteendet och returnerar true eller false efter behov.

Smidig försämring av funktionalitet

Att kunna identifiera om kod har behörighet att göra det den behöver göra är intressant för kod som kan köras från olika zoner. Det är en sak att identifiera zonen, men det är mycket bättre att tillhandahålla ett alternativ för användaren, om möjligt. Ett fullständigt förtroendeprogram gör det till exempel vanligtvis möjligt för användare att skapa filer var de vill, medan ett program med partiellt förtroende bara kan skapa filer i isolerad lagring. Om koden för att skapa en fil finns i en sammansättning som delas av både program med fullständigt förtroende (fristående) och partiellt förtroende (webbläsarbaserade) program, och båda programmen vill att användarna ska kunna skapa filer, bör den delade koden identifiera om den körs i partiellt eller fullständigt förtroende innan en fil skapas på rätt plats. Följande kod visar båda.

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

I många fall bör du kunna hitta ett delvis förtroendealternativ.

I en kontrollerad miljö, till exempel ett intranät, kan anpassade hanterade ramverk installeras över klientbasen i den globala sammansättningscachen (GAC). Dessa bibliotek kan köra kod som kräver fullständigt förtroende och refereras från program som endast tillåts delvis förtroende med hjälp AllowPartiallyTrustedCallersAttribute av (mer information finns i Säkerhet och WPF-säkerhetsstrategi – Plattformssäkerhet).

Identifiering av webbläsares värd

Att använda CAS för att kontrollera behörigheter är en lämplig metod när du behöver göra det för varje behörighet specifikt. Även om den här tekniken är beroende av att fånga undantag som en del av normal bearbetning, vilket inte rekommenderas i allmänhet och kan ha prestandaproblem. Om ditt XAML-webbläsarprogram (XBAP) istället bara körs inom sandlådan för Internetzonen kan du använda egenskapen BrowserInteropHelper.IsBrowserHosted, som returnerar true för XAML-webbläsarprogram (XBAPs).

Varning

XBAP:er kräver att äldre webbläsare används, till exempel Internet Explorer och gamla versioner av Firefox. Dessa äldre webbläsare stöds vanligtvis inte i Windows 10 och Windows 11. Moderna webbläsare stöder inte längre den teknik som krävs för XBAP-appar på grund av säkerhetsrisker. Plugin-program som aktiverar XBAP:er stöds inte längre. Mer information finns i Vanliga frågor och svar om WPF-webbläsarbaserade program (XBAP).

Anmärkning

IsBrowserHosted anger endast om ett program körs i en webbläsare, inte vilken uppsättning behörigheter ett program körs med.

Hantera behörigheter

Som standard körs XBAP:er med partiellt förtroende (standardbehörighetsuppsättningen i zonen Internet). Beroende på programmets krav är det dock möjligt att ändra behörighetsuppsättningen från standardinställningen. Om till exempel en XBAPs startas från ett lokalt intranät kan den dra nytta av en ökad behörighetsuppsättning som visas i följande tabell.

Varning

XBAP:er kräver att äldre webbläsare används, till exempel Internet Explorer och gamla versioner av Firefox. Dessa äldre webbläsare stöds vanligtvis inte i Windows 10 och Windows 11. Moderna webbläsare stöder inte längre den teknik som krävs för XBAP-appar på grund av säkerhetsrisker. Plugin-program som aktiverar XBAP:er stöds inte längre. Mer information finns i Vanliga frågor och svar om WPF-webbläsarbaserade program (XBAP).

Tabell 3: LocalIntranet- och Internetbehörigheter

Tillåtelse Egenskap LocalIntranet Internet
DNS (Domännamnssystem) Få åtkomst till DNS-servrar Ja Nej
Miljövariabler Läs Ja Nej
Fildialoger Öppna Ja Ja
Fildialoger Obegränsat Ja Nej
Isolerad lagring Sammansättningsisolering efter användare Ja Nej
Isolerad lagring Okänd isolering Ja Ja
Isolerad lagring Obegränsad användarkvot Ja Nej
Media Säkert ljud, video och bilder Ja Ja
Utskrift Standardutskrift Ja Nej
Utskrift Säker utskrift Ja Ja
Reflektion Avge Ja Nej
Säkerhet Körning av hanterad kod Ja Ja
Säkerhet Bekräfta beviljade behörigheter Ja Nej
Användargränssnitt Obegränsat Ja Nej
Användargränssnitt Säkra fönster på översta nivån Ja Ja
Användargränssnitt Personligt Urklipp Ja Ja
Webbläsare Säker ramnavigering till HTML Ja Ja

Anmärkning

Klipp och klistra tillåts endast vid begränsad tillit när det är användarinitierat.

Om du behöver öka behörigheterna måste du ändra projektinställningarna och ClickOnce-programmanifestet. Mer information finns i Översikt över WPF XAML-webbläsarprogram. Följande dokument kan också vara till hjälp.

Om XBAP kräver fullständigt förtroende kan du använda samma verktyg för att öka de begärda behörigheterna. Även om en XBAP endast får fullständigt förtroende om den är installerad på och startad från den lokala datorn, intranätet eller från en URL som visas i webbläsarens betrodda eller tillåtna webbplatser. Om programmet installeras från intranätet eller en betrodd plats får användaren den vanliga ClickOnce-uppmaningen som meddelar dem om de utökade behörigheterna. Användaren kan välja att fortsätta eller avbryta installationen.

Du kan också använda ClickOnce Trusted Deployment-modellen för fullständig förtroendedistribution från valfri säkerhetszon. Mer information finns i Översikt över distribution av betrodda program och säkerhet.

Se även