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: Declare a permissão (supondo que foi concedida ao seu aplicativo), ou usar uma versão do recurso escrito para funcionar 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ção:

Por padrão, as ferramentas que geram ClickOnce implantações padrão essas implantações solicitar confiança total de computadores em que eles executado. 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ção:

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

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 que você deve ter para usar cada classe FileDialog.

Classe

Valor de Acesso Necessário

OpenFileDialog

Open

SaveFileDialog

Save

Observação:

Não é solicitada permissão específica até a OpenFile Na verdade, é chamado de método.

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ção:

T Ele lógica de programação para o salvar recurso não é mostrado no exemplo.

 [Visual Basic]
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ção:

Em Visual C#, certifique-se de que você adicione código para ativar 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 Introdução ao armazenamento isolado.

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 Segurança Acessar Código and ADO.NET.

Se você não quiser acessar diretamente um banco de dados porque você quer que sua aplicação execute em confiança parcial, você pode usar um serviço Web XML como um meio alternativo para acessar seus dados.Um serviço Web XML é um fragmento de software que pode ser acessado por programação via rede através de XML.Com Serviços Web XML, aplicativos podem compartilhar dados entre zonas de grupos de código.Por padrão, a aplicativos na Intranet local e zonas da Internet é concedido o direito de acessar seus sites de origem, o que os torna capaz de chamar um serviço Web XML.Para obter mais informações sobre serviço Web XML, consulte XML Web Services Usando ASP.NET.Para maiores informações sobre como usar um serviço Web XML, consulte Building XML Web Service Clients.

Acesso ao Registro

A classe RegistryPermission controla o acesso ao registro do sistema operacional.Por padrão, somente os aplicativos que estão sendo executados localmente podem acesso no registro.RegistryPermission concede somente um aplicativo direita para tentar o registro de acesso; ele não garante acesso será bem-sucedida, porque o sistema operacional ainda impõe 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

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

Referência

Geração e Edição (Mage.exe) ferramenta de manifesto

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

Outros recursos

Segurança dos Formulários do Windows