Compartilhar via


Acesso a Dados e Arquivos nos Formulários do Windows Mais Seguro

O .NET Framework usa permissões para ajudar a proteger recursos e dados. Os locais onde seu aplicativo pode ler ou gravar dados depende das permissões concedidas ao aplicativo. Quando seu aplicativo é executado em um ambiente com confiança parcial, talvez você não tenha acesso aos seus dados ou talvez você precise alterar a maneira como você acessa os dados.

Quando você encontrar uma restrição de segurança, você tem duas opções: declarar a permissão (supondo que ele concedeu ao seu aplicativo) ou usar uma versão do recurso gravada para trabalhar em confiança parcial. As seções seguintes abordam como trabalhar com acesso a arquivos, banco de dados e ao Registro a partir de aplicativos que estão executando em um ambiente de confiança parcial.

ObservaçãoObservação

Por padrão, as ferramentas que geram distribuições ClickOnce padronizam essas distribuições para solicitar confiança total dos computadores em que elas executarem. Se você decidir que quer os benefícios adicionais de segurança de executar em confiança parcial, você deve alterar esse padrão em Visual Studio ou em uma das ferramentas Windows Software Development Kit (SDK) (Mage.exe ou MageUI.exe). Para obter mais informações sobre segurança dos Formulários do Windows e sobre como determinar a nível de confiança apropriado para seu aplicativo, consulte Visão Geral da Segurança em Formulários do Windows.

Acesso a Arquivos

A classe FileIOPermission controla o acesso a arquivos e pastas em .NET Framework. Por padrão, o sistema de segurança não concede FileIOPermission a ambientes com confiança parcial, como o Intranet local e as zonas de Internet. No entanto, um aplicativo que requer acesso a arquivos ainda pode funcionar nestes ambientes se você modificar o design do seu aplicativo ou usar métodos diferentes para acessar arquivos. Por padrão, à zona da intranet local é concedido o direito de ter o mesmo acesso a sites e o mesmo acesso a diretórios, para conectar-se de volta com o site de sua origem e ler seu diretório de instalação. Por padrão, à zona de Internet só é concedido o direito de conectar-se novamente ao site de sua origem.

Arquivos Especificados pelo Usuário

Uma maneira de lidar com o fato de não se ter permissão a acesso a arquivos é requisitar ao usuário que forneça informações específicas do arquivo usando a classe OpenFileDialog ou SaveFileDialog. Essa interação com o usuário ajuda a fornecer alguma garantia de que o aplicativo não pode carregar arquivos particulares ou substituir arquivos importantes de maneira mal-intencionada. Os métodos OpenFile e OpenFile fornecem acesso a leitura e escrita de arquivos abrindo um fluxo para o arquivo que o usuário especificou. Os métodos também ajudam a proteger o arquivo do usuário ocultando o caminho do arquivo.

ObservaçãoObservação

Essas permissões são diferentes dependendo de se seu aplicativo estiver na zona da Internet ou na zona da Intranet. Aplicativos da zona da Internet só podem usar a OpenFileDialog, enquanto os aplicativos de Intranet têm permissão irrestrita a caixas de diálogo de arquivos.

A classe FileDialogPermission especifica quais tipos de caixas de diálogo de arquivos o seu aplicativo pode usar. A tabela a seguir mostra o valor necessário para usar cada FileDialog classe.

Classe

Valor de Acesso Necessário

OpenFileDialog

Open

SaveFileDialog

Save

ObservaçãoObservação

A permissão específica não é solicitada até que o método OpenFile seja chamado de fato.

Permissão para exibir uma caixa de diálogo de arquivos não concede a seu aplicativo o acesso completo a todos os membros das classes FileDialog, OpenFileDialog e SaveFileDialog. Para as permissões exatas que são necessárias para chamar cada método, consulte o tópico de referência dos mesmos na documentação da biblioteca de classes .NET Framework.

O código exemplo a seguir usa o método OpenFile para abrir um arquivo especificado pelo usuário em um controle RichTextBox. O exemplo requer FileDialogPermission e o valor enumerado Open associado. O exemplo mostra como manipular a SecurityException para determinar se o recurso de salvamento deve ser desabilitado. Esse exemplo requer que seu Form possua um controle Button chamado ButtonOpen e um controle RichTextBox chamado RtfBoxMain.

ObservaçãoObservação

A lógica de programação para o recurso de salvamento não é mostrada no exemplo.

Private Sub ButtonOpen_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles ButtonOpen.Click 

    Dim editingFileName as String = ""
    Dim saveAllowed As Boolean = True

    ' Displays the OpenFileDialog.
    If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
        Dim userStream as System.IO.Stream
        Try 
            ' Opens the file stream for the file selected by the user.
            userStream =OpenFileDialog1.OpenFile() 
            Me.RtfBoxMain.LoadFile(userStream, _
                RichTextBoxStreamType.PlainText)
        Finally
            userStream.Close()
        End Try

        ' Tries to get the file name selected by the user.
        ' Failure means that the application does not have
        ' unrestricted permission to the file.
        Try 
            editingFileName = OpenFileDialog1.FileName
        Catch ex As Exception
            If TypeOf ex Is System.Security.SecurityException Then 
                ' The application does not have unrestricted permission 
                ' to the file so the save feature will be disabled.
                saveAllowed = False 
            Else 
                Throw ex
            End If
        End Try
    End If
End Sub
private void ButtonOpen_Click(object sender, System.EventArgs e) 
{
    String editingFileName = "";
    Boolean saveAllowed = true;

    // Displays the OpenFileDialog.
    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    {
        // Opens the file stream for the file selected by the user.
        using (System.IO.Stream userStream = openFileDialog1.OpenFile()) 
        {
            this.RtfBoxMain.LoadFile(userStream,
                RichTextBoxStreamType.PlainText);
            userStream.Close();
        }

        // Tries to get the file name selected by the user.
        // Failure means that the application does not have
        // unrestricted permission to the file.
        try 
        {
            editingFileName = openFileDialog1.FileName;
        } 
        catch (Exception ex) 
        {
            if (ex is System.Security.SecurityException) 
            {
                // The application does not have unrestricted permission 
                // to the file so the save feature will be disabled.
                saveAllowed = false; 
            } 
            else 
            {
                throw ex;
            }
        }
    }
}
ObservaçãoObservação

Na Visual C#, certifique-se de adicionar código para habilitar o manipulador de eventos. Usando o código do exemplo anterior, o código a seguir mostra como ativar o manipulador de eventos. this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);

Outros arquivos

Às vezes, você precisará ler ou gravar arquivos que o usuário não especifica, como quando você precisa salvar as configurações do aplicativo. Na Intranet local e nas zonas de Internet, seu aplicativo não terá permissão para armazenar dados em um arquivo local. No entanto, seu aplicativo poderá armazenar dados em armazenamento isolado. O armazenamento isolado é um compartimento de dados abstrato (não um local de armazenamento específico) que contém um ou mais arquivos de armazenamento isolados, chamados de armazenamentos, que contêm os locais reais dos Diretórios onde os dados são armazenados. Permissões de acesso a arquivos como FileIOPermission não são necessários; em vez disso, a classe IsolatedStoragePermission controla as permissões para armazenamento isolado. Por padrão, aplicativos que estão sendo executados na Intranet local e zonas de Internet podem armazenar dados usando armazenamento isolado; no entanto, configurações como cota de disco podem variar. Para obter mais informações sobre armazenamento isolado, consulte armazenamentos isolados.

O exemplo a seguir usa armazenamento isolado para gravar dados em um arquivo localizado em um armazenamento. O exemplo requer IsolatedStorageFilePermission e o valor enumerado DomainIsolationByUser. O exemplo mostra a leitura e a escrita de certos valores de propriedades do controle Button em um arquivo em armazenamento isolado. A função Read é chamada depois que o aplicativo inicia e a função Write é chamada antes de o aplicativo terminar. O exemplo precisa que as funções Read e Write existam como membros de um Form que contenha um controle Button chamado MainButton.

' Reads the button options from the isolated storage. Uses Default values 
' for the button if the options file does not exist.
Public Sub Read() 
    Dim isoStore As System.IO.IsolatedStorage.IsolatedStorageFile = _
        System.IO.IsolatedStorage.IsolatedStorageFile. _ 
        GetUserStoreForDomain()

    Dim filename As String = "options.txt"
    Try
        ' Checks to see if the options.txt file exists.
        If (isoStore.GetFileNames(filename).GetLength(0) <> 0) Then

            ' Opens the file because it exists.
            Dim isos As New System.IO.IsolatedStorage.IsolatedStorageFileStream _ 
                 (filename, IO.FileMode.Open,isoStore)
            Dim reader as System.IO.StreamReader
            Try 
                reader = new System.IO.StreamReader(isos)

                ' Reads the values stored.
                Dim converter As System.ComponentModel.TypeConverter
                converter = System.ComponentModel.TypeDescriptor.GetConverter _ 
                    (GetType(Color))

                Me.MainButton.BackColor = _ 
                        CType(converter.ConvertFromString _ 
                         (reader.ReadLine()), Color)
                me.MainButton.ForeColor = _
                        CType(converter.ConvertFromString _ 
                         (reader.ReadLine()), Color)

                converter = System.ComponentModel.TypeDescriptor.GetConverter _ 
                    (GetType(Font))
                me.MainButton.Font = _
                        CType(converter.ConvertFromString _ 
                         (reader.ReadLine()), Font)

            Catch ex As Exception
                Debug.WriteLine("Cannot read options " + _
                    ex.ToString())
            Finally
                reader.Close()
            End Try
        End If

    Catch ex As Exception
        Debug.WriteLine("Cannot read options " + ex.ToString())
    End Try
End Sub

' Writes the button options to the isolated storage.
Public Sub Write() 
    Dim isoStore As System.IO.IsolatedStorage.IsolatedStorageFile = _
        System.IO.IsolatedStorage.IsolatedStorageFile. _ 
        GetUserStoreForDomain()

    Dim filename As String = "options.txt"
    Try 
        ' Checks if the file exists, and if it does, tries to delete it.
        If (isoStore.GetFileNames(filename).GetLength(0) <> 0) Then
            isoStore.DeleteFile(filename)
        End If
    Catch ex As Exception
        Debug.WriteLine("Cannot delete file " + ex.ToString())
    End Try

    ' Creates the options.txt file and writes the button options to it.
    Dim writer as System.IO.StreamWriter
    Try 
        Dim isos As New System.IO.IsolatedStorage.IsolatedStorageFileStream _ 
             (filename, IO.FileMode.CreateNew, isoStore)

        writer = New System.IO.StreamWriter(isos)
        Dim converter As System.ComponentModel.TypeConverter

        converter = System.ComponentModel.TypeDescriptor.GetConverter _ 
           (GetType(Color))
        writer.WriteLine(converter.ConvertToString( _
            Me.MainButton.BackColor))
        writer.WriteLine(converter.ConvertToString( _
            Me.MainButton.ForeColor))

        converter = System.ComponentModel TypeDescriptor.GetConverter _ 
           (GetType(Font))
        writer.WriteLine(converter.ConvertToString( _
            Me.MainButton.Font))

    Catch ex as Exception
        Debug.WriteLine("Cannot write options " + ex.ToString())

    Finally
        writer.Close()
    End Try
End Sub
// Reads the button options from the isolated storage. Uses default values 
// for the button if the options file does not exist.
public void Read() 
{
    System.IO.IsolatedStorage.IsolatedStorageFile isoStore = 
        System.IO.IsolatedStorage.IsolatedStorageFile.
        GetUserStoreForDomain();

    string filename = "options.txt";
    try
    {
        // Checks to see if the options.txt file exists.
        if (isoStore.GetFileNames(filename).GetLength(0) != 0) 
        {
            // Opens the file because it exists.
            System.IO.IsolatedStorage.IsolatedStorageFileStream isos = 
                new System.IO.IsolatedStorage.IsolatedStorageFileStream
                    (filename, System.IO.FileMode.Open,isoStore);
            System.IO.StreamReader reader = null;
            try 
            {
                reader = new System.IO.StreamReader(isos);

                // Reads the values stored.
                TypeConverter converter ;
                converter = TypeDescriptor.GetConverter(typeof(Color));

                this.MainButton.BackColor = 
                 (Color)(converter.ConvertFromString(reader.ReadLine()));
                this.MainButton.ForeColor = 
                 (Color)(converter.ConvertFromString(reader.ReadLine()));

                converter = TypeDescriptor.GetConverter(typeof(Font));
                this.MainButton.Font = 
                  (Font)(converter.ConvertFromString(reader.ReadLine()));
            }
            catch (Exception ex)
            { 
                System.Diagnostics.Debug.WriteLine
                     ("Cannot read options " + ex.ToString());
            }
            finally
            {
                reader.Close();
            }
        }
    } 
    catch (Exception ex) 
    {
        System.Diagnostics.Debug.WriteLine
            ("Cannot read options " + ex.ToString());
    }
}

// Writes the button options to the isolated storage.
public void Write() 
{
    System.IO.IsolatedStorage.IsolatedStorageFile isoStore = 
        System.IO.IsolatedStorage.IsolatedStorageFile.
        GetUserStoreForDomain();

    string filename = "options.txt";
    try 
    {
        // Checks if the file exists and, if it does, tries to delete it.
        if (isoStore.GetFileNames(filename).GetLength(0) != 0) 
        {
            isoStore.DeleteFile(filename);
        }
    }
    catch (Exception ex) 
    {
        System.Diagnostics.Debug.WriteLine
            ("Cannot delete file " + ex.ToString());
    }

    // Creates the options file and writes the button options to it.
    System.IO.StreamWriter writer = null;
    try 
    {
        System.IO.IsolatedStorage.IsolatedStorageFileStream isos = new 
            System.IO.IsolatedStorage.IsolatedStorageFileStream(filename, 
            System.IO.FileMode.CreateNew,isoStore);

        writer = new System.IO.StreamWriter(isos);
        TypeConverter converter ;

        converter = TypeDescriptor.GetConverter(typeof(Color));
        writer.WriteLine(converter.ConvertToString(
            this.MainButton.BackColor));
        writer.WriteLine(converter.ConvertToString(
            this.MainButton.ForeColor));

        converter = TypeDescriptor.GetConverter(typeof(Font));
        writer.WriteLine(converter.ConvertToString(
            this.MainButton.Font));

    }
    catch (Exception ex)
    { 
        System.Diagnostics.Debug.WriteLine
           ("Cannot write options " + ex.ToString());
    }
    finally
    {
        writer.Close();
    }
}

Acesso ao Banco de dados

A permissão necessária para acessar um banco de dados varia com base no provedor de banco de dados; entretanto, somente aplicativos que estão executando com as permissões apropriadas podem acessar um banco de dados via um conexão de dados. Para mais informações sobre permissões necessárias para acessar um banco de dados, consulte Code Access Security and ADO.NET.

Se você não poderá acessar diretamente um banco de dados porque você deseja que o aplicativo seja executado em confiança parcial, você pode usar um serviço da Web como um meio alternativo para acessar seus dados. Um serviço Web é uma parte do software que pode ser acessado programaticamente através de uma rede. Com os serviços da Web, aplicativos podem compartilhar dados em regiões do grupo de código. Por padrão, aplicativos de intranet local e zonas da Internet têm o direito para acessar seus sites de origem, o que os permite chamar um serviço Web hospedado no mesmo servidor. Para obter mais informações, consulte ASP.NET AJAX and Web Services ou O Windows Communication Foundation.

Acesso ao Registro

A classe RegistryPermission controla o acesso ao registro do sistema operacional. Por padrão, somente os aplicativos que estejam executando localmente podem acessar o registro. RegistryPermissionconcede somente um aplicativo de direita para tentar o acesso ao registro; ele não garante acesso terá êxito, porque o sistema operacional ainda reforça a segurança no registro.

Como você não pode acessar o registro sob confiança parcial, é possível que você precise encontrar outros métodos de armazenar seus dados. Quando você armazena configurações do aplicativo, use armazenamento isolado ao invés do registro. O armazenamento isolado também pode ser usado para armazenar outros arquivos específicos do aplicativo. Você também pode armazenar informações globais do aplicativo sobre o servidor ou site de origem porque por padrão é concedido a uma aplicação o direito de acessar o seu site de origem.

Consulte também

Referência

Mage (geração de manifesto e ferramenta de edição)

MageUI.exe (geração de manifesto e edição da ferramenta, o cliente gráfico)

Conceitos

Impressão Mais Segura em Formulários do Windows

Considerações de Segurança Adicionais em Formulários do Windows

Visão Geral da Segurança em Formulários do Windows

Outros recursos

Segurança dos Formulários do Windows