Segurança de confiança parcial do WPF
Em geral, as aplicações da Internet devem ser impedidas de ter acesso direto a recursos críticos do sistema, para evitar danos maliciosos. Por padrão, HTML e linguagens de script do lado do cliente não são capazes de acessar recursos críticos do sistema. Como os aplicativos hospedados no navegador Windows Presentation Foundation (WPF) 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 da Segurança de Acesso ao Código (CAS) e do ClickOnce (consulte Estratégia de Segurança do WPF - Segurança da Plataforma). Por padrão, os aplicativos hospedados no navegador solicitam o conjunto de permissões CAS da zona da Internet, independentemente de serem iniciados a partir da Internet, da intranet local ou do computador local. Diz-se que os aplicativos executados com qualquer coisa menos do que o conjunto completo de permissões estão sendo executados 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:
Suporte para confiança parcial na funcionalidade WPF
A tabela a seguir lista os recursos de alto nível do Windows Presentation Foundation (WPF) que são seguros para uso dentro dos limites do conjunto de permissões de zona da Internet.
Tabela 1: Recursos do WPF que são seguros em confiança parcial
Área de Destaque | Funcionalidade |
---|---|
Geral | Janela do navegador Acesso ao Site de Origem IsolatedStorage (limite de 512KB) Provedores de UIAutomation Comando Editores de método de entrada (IMEs) Caneta e tinta para tablet Simulação de arrastar/soltar usando eventos de captura e movimentação do mouse OpenFileDialog Desserialização XAML (via XamlReader.Load) |
Integração Web | Caixa de diálogo de download do navegador Top-Level User-Initiated Navegação mailto:ligações Parâmetros do identificador uniforme de recursos HTTPWebRequest Conteúdo WPF hospedado em um IFRAME Hospedagem de páginas HTML 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) Criação de scripts Modelo de objeto do documento |
Elementos visuais | 2D e 3D Animação Media (Site de Origem e Cross-Domain) Imagem/Áudio/Vídeo |
Leitura | FlowDocuments Documentos XPS Fontes de sistema & incorporadas Fontes CFF & TrueType |
Edição | Verificação ortográfica RichTextBox Suporte para a área de transferência de texto simples e de tinta User-Initiated Colar Copiando o conteúdo selecionado |
Controlos | Controlos Gerais |
Esta tabela abrange 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, as funcionalidades a seguir têm informações mais detalhadas sobre a execução de confiança parcial, incluindo considerações especiais.
XAML (consulte XAML no WPF).
Popups (ver System.Windows.Controls.Primitives.Popup).
Arrastar e soltar (consulte Visão geral de arrastar e soltar).
Área de transferência (ver System.Windows.Clipboard).
Imagiologia (ver System.Windows.Controls.Image).
Serialização (ver XamlReader.Load, XamlWriter.Save).
Caixa de diálogo Abrir Ficheiro (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 Destaque | Funcionalidade |
---|---|
Geral | Janela (janelas definidas pelo aplicativo e caixas de diálogo) Diálogo de Gravação de Ficheiro Sistema de arquivos Acesso ao Registo Arrastar e soltar Serialização XAML (via XamlWriter.Save) Clientes UIAutomation Acesso à janela de origem (HwndHost) Suporte total de fala Interoperabilidade do Windows Forms |
Elementos visuais | Efeitos de bitmap Codificação de Imagem |
Edição | Área de transferência em formato Rich Text Suporte completo a XAML |
Programação de confiança parcial
Para aplicativos XBAP, o código que excede 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 quando 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 confiança total.
Advertência
Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).
Zona de Segurança | Comportamento | Obter confiança total |
---|---|---|
Computador local | Confiança total automática | Nenhuma ação é necessária. |
Intranet e sites confiáveis | Solicitar 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" | Assine o XBAP com um certificado. |
Observação
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 no navegador. O CAS e o WPF oferecem várias técnicas para gerenciar esse cenário.
Detetando permissões usando 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 funcionalidades que podem exigir mais permissões do que o conjunto de permissões concedido pelo aplicativo permite. Seu aplicativo pode detetar se ele tem ou não uma determinada permissão usando a segurança do Microsoft .NET Framework. Especificamente, ele pode testar se 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 lançará uma exceção de segurança. Caso contrário, a permissão foi concedida.
IsPermissionGranted
encapsula esse comportamento e retorna true
ou false
quando apropriado.
Degradação graciosa da funcionalidade
Ser capaz de detetar se o código tem a permissão para fazer o que precisa fazer é interessante para o código que pode ser executado a partir de diferentes zonas. Embora detetar 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 onde quiserem, enquanto um aplicativo de confiança parcial só pode criar arquivos em armazenamento isolado. Se o código para criar um arquivo existir em um assembly que é compartilhado por aplicativos de confiança total (autônomos) e aplicativos de confiança parcial (hospedados pelo navegador), e ambos os aplicativos querem que os usuários possam criar arquivos, o código compartilhado deve detetar se ele está sendo executado 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 em toda a base de clientes no cache de assembly global (GAC). Essas bibliotecas podem executar código que requer confiança total e ser referenciadas a partir de aplicativos que só têm confiança parcial permitida usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Security e WPF Security Strategy - Platform Security).
Deteção de host do navegador
Utilizar o CAS para verificar permissões é uma técnica adequada quando é necessário verificar cada permissão individualmente. No entanto, esta técnica depende 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 seu aplicativo de navegador XAML (XBAP) só for executado dentro da área restrita da zona da Internet, você poderá usar a propriedade BrowserInteropHelper.IsBrowserHosted, que retornará true para aplicativos de navegador XAML (XBAPs).
Advertência
Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).
Observação
IsBrowserHosted apenas distingue se um aplicativo está sendo executado em um navegador, não com qual conjunto de permissões um aplicativo está sendo executado.
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 a partir de uma intranet local, ele poderá aproveitar um conjunto de permissões aumentado, que é mostrado na tabela a seguir.
Advertência
Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).
Tabela 3: Permissões de LocalIntranet e Internet
Permissão | Atributo | Intranet local | Internet |
---|---|---|---|
DNS | Aceder a servidores DNS | Sim | Não |
Variáveis de ambiente | Ler | Sim | Não |
Caixas de diálogo de ficheiro | Aberto | Sim | Sim |
Diálogos de ficheiro | Sem restrições | Sim | Não |
Armazenamento isolado | Isolamento de montagem por usuário | Sim | Não |
Armazenamento isolado | Isolamento desconhecido | Sim | Sim |
Armazenamento isolado | Quota de utilizador 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 | Emissão | Sim | Não |
Segurança | Execução de código gerenciado | Sim | Sim |
Segurança | Afirmar permissões concedidas | Sim | Não |
Interface do usuário | Sem restrições | 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 segura de quadros para HTML | Sim | Sim |
Observação
Recortar e colar só é permitido em ambiente de confiança parcial quando iniciado pelo utilizador.
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 de aplicativos de navegador WPF XAML. Os seguintes documentos também podem ser úteis.
Se o seu XBAP requer confiança total, você pode usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP só receba confiança total se for instalado e iniciado a partir do computador local, da intranet ou de um URL listado nos sites confiáveis ou permitidos do navegador. Se o aplicativo for instalado a partir da intranet ou de um site confiável, o usuário receberá o prompt padrão do ClickOnce notificando-o sobre as permissões elevadas. O usuário pode optar por continuar ou cancelar a instalação.
Como alternativa, você pode usar o modelo de implantação confiável ClickOnce para implantação de confiança total de qualquer zona de segurança. Para obter mais informações, consulte a Visão Geral da implantação de aplicativos confiáveis e Segurança.
Ver também
.NET Desktop feedback