Segurança parcialmente confiável do WPF
Em geral, os aplicativos da Internet devem ter acesso restrito aos 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 podem 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 CAS (Segurança de Acesso ao Código) 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 da Internet, da intranet local ou do computador local. Aplicativos que são executados com nada menos do que o conjunto completo de permissões devem ser 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 em 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 Windows Presentation Foundation (WPF) que podem ser usados com segurança 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 recurso | Recurso |
---|---|
Geral | Janela do Navegador Local do acesso de origem IsolatedStorage (limite de 512KB) Provedores de UIAutomation Comando IMEs (Editores de Método de Entrada) Tinta e caneta eletrônica 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 iniciada pelo usuário de nível superior mailto:links Parâmetros do Uniform Resource Identifier HTTPWebRequest Conteúdo do WPF hospedado em um IFRAME Hospedagem de páginas do mesmo Site HTML usando o quadro Hospedagem de páginas do mesmo Site HTML usando o navegador da Web Serviços Web (ASMX) Serviços Web (usando o Windows Communication Foundation) Scripting Modelo de Objeto do Documento |
Visuais | 2D e 3D Animação Mídia (Site de origem e entre domínios) Geração de imagens/áudio/vídeo |
Lendo | FlowDocuments Documentos XPS Fontes internas e do sistema Fontes CFF e TrueType |
Edição | Verificação de ortografia RichTextBox Texto sem formatação e suporte à área de transferência de tinta Colar iniciado pelo usuário Copiando conteúdo selecionado |
Controls | 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 (Visão geral de arrastar e soltar).
Área de transferência (ver System.Windows.Clipboard).
Exames de imagem (ver 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 de WPF que não estão seguros em confiança parcial
Área de recurso | Recurso |
---|---|
Geral | Janela (Caixas de diálogo e janelas definidas pelo aplicativo) SaveFileDialog Sistema de arquivos Acesso ao Registro Arrastar e soltar Serialização de XAML (via XamlWriter.Save) Clientes de UIAutomation Acesso à fonte de janela (HwndHost) Suporte completo à fala Interoperabilidade dos Windows Forms |
Visuais | Efeitos de bitmap Codificação de imagem |
Edição | Área de transferência do formato Rich Text Suporte completo para 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 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 confiança total.
Aviso
Os XBAPs exigem navegadores legados para operar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são compatíveis com Windows 10 e 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 frequentes sobre aplicativos hospedados no navegador do WPF (XBAP).
Zona de segurança | Comportamento | Obtendo confiança total |
---|---|---|
Computador local | Confiança total automática | Nenhuma ação é necessária. |
Intranet e sites confiáveis | Aviso para confiança total | Assinar o XBAP com um certificado para que o usuário veja o código-fonte no aviso. |
Internet | Falha com "Confiança não concedida" | Assine XBAP com um certificado. |
Observação
O comportamento descrito na tabela anterior é de confiança total XBAPs que não seguem o modelo de implantação do ClickOnce confiáveis.
Em geral, o código que pode exceder as permissões permitidas é provavelmente código comum que é compartilhado entre autônomos e aplicativos hospedados pelo navegador. O CAS e o 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, código pode executar funcionalidades que podem exigir mais permissões do que o conjunto de permissões que o 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 tem uma permissão específica chamando o Demand método na instância da permissão desejada. Isso é mostrado no exemplo a seguir, que tem código que consulta para que tenha 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 em diferentes regiões. Ao detectar a zona é uma coisa, que é muito melhor fornecer uma alternativa para o usuário, se possível. Por exemplo, um aplicativo de confiança total geralmente permite aos usuários criar arquivos em qualquer lugar que querem, embora um aplicativo parcialmente confiável só pode criar arquivos no armazenamento isolado. Se o código para criar um arquivo existe em um assembly que é compartilhado por aplicativos de confiança total (autônomo) e aplicativos de confiança parcial (online) e ambos os aplicativos deseja que os usuários criem 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 a 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 GAC (cache de assembly global). Essas bibliotecas podem executar código que requer confiança total e ser referenciadas de aplicativos que só têm permissão de confiança parcial usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Estratégia de segurança e 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 por permissão. No entanto, essa técnica depende capturar exceções como uma parte normal processamento, que não é recomendado em geral e pode ter problemas de desempenho. Em vez disso, se o aplicativo de navegador XAML (XBAP) for executado apenas na área restrita da zona da Internet, você poderá usar a BrowserInteropHelper.IsBrowserHosted propriedade, que retorna true para aplicativos de navegador XAML (XBAPs).
Aviso
Os XBAPs exigem navegadores legados para operar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são compatíveis com Windows 10 e 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 frequentes sobre aplicativos hospedados no navegador do 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 padrão. Por exemplo, se um XBAPs for iniciado de uma intranet local, ele poderá aproveitar um conjunto de permissões aumentado, que é mostrado na tabela a seguir.
Aviso
Os XBAPs exigem navegadores legados para operar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são compatíveis com Windows 10 e 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 frequentes sobre aplicativos hospedados no navegador do WPF (XBAP).
Tabela 3: Permissões de Intranet Local e de Internet
Permissão | Atributo | Intranet Local | Internet |
---|---|---|---|
DNS | Acessar Servidores DNS | Sim | No |
Variáveis de ambiente | Ler | Sim | No |
Caixas de diálogo de arquivo | Aberto | Sim | Sim |
Caixas de diálogo de arquivo | Irrestrito | Sim | No |
Armazenamentos isolado | Isolamento de assembly por usuário | Sim | No |
Armazenamentos isolado | Isolamento desconhecido | Sim | Sim |
Armazenamentos isolado | Cota de usuário ilimitada | Sim | No |
Mídia | Imagens, vídeo e áudio seguro | Sim | Sim |
Imprimindo | Impressão padrão | Sim | No |
Imprimindo | Impressão segura | Sim | Sim |
Reflexão | Emitir | Sim | Não |
Segurança | Execução de código gerenciado | Sim | Sim |
Segurança | Declarar permissões concedidas | Sim | Não |
Interface do Usuário | Irrestrito | Sim | Não |
Interface do Usuário | Windows de nível de segurança superior | 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 |
Observação
Recortar e colar só é permitido em confiança parcial quando iniciada pelo usuário.
Se você precisar aumentar as permissões, você 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 XAML WPF. 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 só receba confiança total se for instalado e iniciado no computador local, na intranet ou em uma URL listada nos sites confiáveis ou permitidos do navegador. Se o aplicativo for instalado da intranet ou em um site confiável, o usuário receberá o prompt ClickOnce padrão notificando sobre as 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 do ClickOnce confiáveis para implantação de confiança total de qualquer zona de segurança. Para obter mais informações, consulte Visão geral da implantação de aplicativos confiáveis e segurança.
Confira também
.NET Desktop feedback