Segurança de confiança parcial do WPF
Em geral, os aplicativos da Internet devem ser impedidos de ter acesso direto a recursos críticos do sistema, para evitar danos mal-intencionados. Por padrão, as linguagens de script HTML e do lado do cliente não são capazes de acessar recursos críticos do sistema. Como os aplicativos hospedados pelo navegador WPF (Windows Presentation Foundation) podem ser iniciados a partir do navegador, eles devem estar em conformidade com um conjunto semelhante de restrições. Para impor essas restrições, o WPF depende do CAS (Code Access Security) e do ClickOnce (consulte Estratégia de Segurança do WPF –de Segurança da Plataforma). Por padrão, os aplicativos hospedados pelo navegador solicitam o conjunto de permissões CAS da zona da Internet, independentemente de serem iniciados da Internet, da intranet local ou do computador local. Aplicativos que são executados com menos do que o conjunto completo de permissões são considerados em execução com confiança parcial.
O WPF fornece uma ampla variedade de suporte para garantir que o máximo de funcionalidade possível possa ser usado com segurança na confiança parcial e, juntamente com o CAS, fornece suporte adicional para programação de confiança parcial.
Este tópico contém as seguintes seções:
Segurança parcialmente confiável do recurso de WPF
A tabela a seguir lista os recursos de alto nível do WPF (Windows Presentation Foundation) que são seguros de usar dentro dos limites do conjunto de permissões de zona da Internet.
Tabela 1: Recursos de WPF que são aceitos em confiança parcial
Área de recursos | Característica |
---|---|
Geral | Janela do navegador Acesso ao Site de Origem IsolatedStorage (limite de 512 KB) Provedores de UIAutomation Comando IMEs (Editores de Método de Entrada) Caneta e Tinta de Tablet Simulação de arrastar/soltar usando eventos de movimento e captura do Mouse OpenFileDialog Desserialização de XAML (via XamlReader) |
Integração da Web | Caixa de diálogo de download do navegador Navegação Top-Level User-Initiated mailto:links Parâmetros uniformes do identificador de recurso HTTPWebRequest Conteúdo do WPF hospedado em um IFRAME Hospedagem de páginas HTML de Same-Site usando Frame Hospedagem de páginas HTML do mesmo site usando WebBrowser Serviços Web (ASMX) Serviços Web (usando o Windows Communication Foundation) Script Modelo de objeto do documento |
Visuais | 2D e 3D Animação Mídia (Site de origem e entre domínios) Imagem/áudio/vídeo |
Leitura | FlowDocuments Documentos XPS Fontes internas e do sistema Fontes CFF e TrueType |
Edição | Verificação ortográfica RichTextBox Texto sem formatação e suporte à área de transferência de tinta Colar iniciado pelo usuário Copiando conteúdo selecionado |
Controles | Controles gerais |
Esta tabela aborda os recursos do WPF em um alto nível. Para obter informações mais detalhadas, o SDK do Windows documenta as permissões exigidas por cada membro no WPF. Além disso, os recursos a seguir possuem informações mais detalhadas sobre a execução em confiança parcial, incluindo considerações especiais.
XAML (consulte XAML no WPF).
Pop-ups (consulte System.Windows.Controls.Primitives.Popup).
Arrastar e soltar (consulte Visão geral de arrastar e soltar).
Área de transferência (consulte System.Windows.Clipboard).
Imagem (consulte System.Windows.Controls.Image).
Serialização (consulte XamlReader.Load, XamlWriter.Save).
Caixa de diálogo Abrir Arquivo (consulte Microsoft.Win32.OpenFileDialog).
A tabela a seguir descreve os recursos do WPF que não são seguros para execução dentro dos limites do conjunto de permissões da zona da Internet.
Tabela 2: Recursos do WPF que não são seguros na confiança parcial
Área de recursos | Característica |
---|---|
Geral | Janela (janelas e caixas de diálogo definidas pelo aplicativo) SaveFileDialog Sistema de ficheiros Acesso ao Registro Arrastar e soltar Serialização de XAML (via XamlWriter.Save) Clientes UIAutomation Acesso à fonte de janela (HwndHost) Suporte completo ao Serviço Cognitivo do Azure para Fala Interoperabilidade do Windows Forms |
Visuais | Efeitos de bitmap Codificação de imagem |
Edição | Área de transferência do formato Rich Text Suporte completo ao XAML |
Programação de confiança parcial
Para aplicativos XBAP, o código que exceder o conjunto de permissões padrão terá um comportamento diferente dependendo da zona de segurança. Em alguns casos, o usuário receberá um aviso ao tentar instalá-lo. O usuário pode optar por continuar ou cancelar a instalação. A tabela a seguir descreve o comportamento do aplicativo para cada zona de segurança e o que você precisa fazer para que o aplicativo receba total confiança.
Aviso
Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.
Zona de Segurança | Comportamento | Obtendo total confiança |
---|---|---|
Computador local | Confiança total automática | Nenhuma ação é necessária. |
Intranet e sites confiáveis | Aviso para confiança total | Assine o XBAP com um certificado para que o usuário veja a origem no prompt. |
Internet | Falha com "Confiança não concedida" | Assinar o XBAP com um certificado. |
Nota
O comportamento descrito na tabela anterior é para XBAPs de confiança total que não seguem o modelo de Implantação Confiável ClickOnce.
Em geral, o código que pode exceder as permissões permitidas provavelmente será um código comum compartilhado entre aplicativos autônomos e hospedados pelo navegador. CAS e WPF oferecem várias técnicas para gerenciar esse cenário.
Detectando permissões usando o CAS
Em algumas situações, é possível que o código compartilhado em assemblies de biblioteca seja usado por aplicativos autônomos e XBAPs. Nesses casos, o código pode executar uma funcionalidade que pode exigir mais permissões do que o conjunto de permissões concedido pelo aplicativo permite. Seu aplicativo pode detectar se ele tem ou não uma determinada permissão usando a segurança do Microsoft .NET Framework. Especificamente, ele pode testar se ele tem uma permissão específica chamando o método Demand na instância da permissão desejada. Isso é mostrado no exemplo a seguir, que tem código que consulta se ele tem a capacidade de salvar um arquivo no disco local:
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
Se um aplicativo não tiver a permissão desejada, a chamada para Demand gerará uma exceção de segurança. Caso contrário, a permissão foi concedida. IsPermissionGranted
encapsula esse comportamento e retorna true
ou false
, conforme apropriado.
Degradação gradual de funcionalidade
Ser capaz de detectar se o código tem permissão para fazer o que precisa fazer é interessante para o código que pode ser executado de diferentes zonas. Embora detectar a zona seja uma coisa, é muito melhor fornecer uma alternativa para o usuário, se possível. Por exemplo, um aplicativo de confiança total normalmente permite que os usuários criem arquivos em qualquer lugar desejado, enquanto um aplicativo de confiança parcial só pode criar arquivos no armazenamento isolado. Se o código para criar um arquivo existir em um assembly compartilhado por aplicativos de confiança total (autônomos) e aplicativos de confiança parcial (hospedados pelo navegador) e ambos os aplicativos desejarem que os usuários possam criar arquivos, o código compartilhado deverá detectar se ele está em execução em confiança parcial ou total antes de criar um arquivo no local apropriado. O código a seguir demonstra ambos.
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
Em muitos casos, você deve ser capaz de encontrar uma alternativa de confiança parcial.
Em um ambiente controlado, como uma intranet, estruturas gerenciadas personalizadas podem ser instaladas no GAC (cache de assembly global) em toda a base de clientes. Essas bibliotecas podem executar código que requer confiança total e ser referenciadas a partir de aplicativos que são permitidos apenas confiança parcial usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Segurança e Estratégia de Segurança do WPF – Segurança da Plataforma).
Detecção de host do navegador
Usar o CAS para verificar permissões é uma técnica adequada quando você precisa verificar cada permissão individualmente. Embora essa técnica dependa da captura de exceções como parte do processamento normal, o que não é recomendado em geral e pode ter problemas de desempenho. Em vez disso, se o seu aplicativo de navegador XAML (XBAP) for executado apenas na área restrita da zona de Internet, você poderá usar a propriedade BrowserInteropHelper.IsBrowserHosted, que retorna true para XBAPs (aplicativos de navegador XAML).
Aviso
Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.
Nota
IsBrowserHosted só distingue se um aplicativo está em execução em um navegador, não com qual conjunto de permissões um aplicativo está em execução.
Gerenciando permissões
Por padrão, os XBAPs são executados com confiança parcial (conjunto de permissões de zona da Internet padrão). No entanto, dependendo dos requisitos do aplicativo, é possível alterar o conjunto de permissões do padrão. Por exemplo, se um XBAPs for iniciado de uma intranet local, ele poderá aproveitar um conjunto de permissões maior, que é mostrado na tabela a seguir.
Aviso
Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.
Tabela 3: LocalIntranet e Permissões de Internet
Permissão | Atributo | LocalIntranet | Internet |
---|---|---|---|
DNS | Acessar servidores DNS | Sim | Não |
Variáveis de ambiente | Ler | Sim | Não |
Caixas de diálogo de arquivo | Abrir | Sim | Sim |
Caixas de diálogo de arquivo | Irrestrito | Sim | Não |
Armazenamento isolado | Isolamento de assembly por usuário | Sim | Não |
Armazenamento isolado | Isolamento desconhecido | Sim | Sim |
Armazenamento isolado | Cota de usuário ilimitada | Sim | Não |
Mídia | Áudio, vídeo e imagens seguros | Sim | Sim |
Impressão | Impressão padrão | Sim | Não |
Impressão | Impressão segura | Sim | Sim |
Reflexão | Emitir | Sim | Não |
Segurança | Execução de código gerenciado | Sim | Sim |
Segurança | Permissões concedidas pela Assert | Sim | Não |
Interface do Usuário | Irrestrito | Sim | Não |
Interface do Usuário | Janelas de nível superior seguras | Sim | Sim |
Interface do Usuário | Área de transferência própria | Sim | Sim |
Navegador da Web | Navegação do quadro seguro para HTML | Sim | Sim |
Nota
Recortar e colar só é permitido em confiança parcial quando iniciada pelo usuário.
Se você precisar aumentar as permissões, precisará alterar as configurações do projeto e o manifesto do aplicativo ClickOnce. Para obter mais informações, consulte Visão Geral dos Aplicativos WPF XAML para Navegador. Os documentos a seguir também podem ser úteis.
Se o XBAP exigir confiança total, você poderá usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP receba confiança total somente se ele estiver instalado e iniciado do computador local, da intranet ou de uma URL listada nos sites confiáveis ou permitidos do navegador. Se o aplicativo estiver instalado da intranet ou de um site confiável, o usuário receberá o prompt clickOnce padrão notificando-os das permissões com privilégios elevados. O usuário pode optar por continuar ou cancelar a instalação.
Como alternativa, você pode usar o modelo de Implantação Confiável do ClickOnce para implantação de confiança total de qualquer zona de segurança. Para obter mais informações, consulte a Visão Geral de Implantação de Aplicativos Confiáveis e Segurança .
Consulte também
.NET Desktop feedback