Více zabezpečený přístup k souborům a datům ve Windows Forms

Rozhraní .NET Framework používá oprávnění k ochraně prostředků a dat. Kde může aplikace číst nebo zapisovat data, závisí na oprávněních udělených aplikaci. Když vaše aplikace běží v prostředí s částečnou důvěryhodností, možná nebudete mít přístup k datům nebo budete muset změnit způsob přístupu k datům.

Když narazíte na omezení zabezpečení, máte dvě možnosti: použijte oprávnění (za předpokladu, že byla udělena vaší aplikaci) nebo použijte verzi funkce napsané pro práci s částečnou důvěryhodností. V následujících částech se dozvíte, jak pracovat se soubory, databází a přístupem k registru z aplikací spuštěných v prostředí s částečnou důvěryhodností.

Poznámka:

Nástroje, které ve výchozím nastavení generují nasazení ClickOnce, ve výchozím nastavení požádají o úplný vztah důvěryhodnosti z počítačů, na kterých běží. Pokud se rozhodnete, že chcete přidat výhody zabezpečení spuštěné v částečné důvěryhodnosti, musíte toto výchozí nastavení změnit buď v sadě Visual Studio, nebo v některém z nástrojů sady Windows SDK (Mage.exe nebo MageUI.exe). Další informace o zabezpečení model Windows Forms a o tom, jak určit odpovídající úroveň důvěryhodnosti pro vaši aplikaci, najdete v tématu Zabezpečení v model Windows Forms Přehled.

Přístup k souborům

Třída FileIOPermission řídí přístup k souborům a složkám v rozhraní .NET Framework. Ve výchozím nastavení systém zabezpečení neuděluje FileIOPermission prostředí částečné důvěryhodnosti, jako je místní intranet a zóny internetu. Aplikace, která vyžaduje přístup k souborům, ale může v těchto prostředích fungovat i v případě, že upravíte návrh aplikace nebo použijete různé metody pro přístup k souborům. Ve výchozím nastavení má místní intranetová zóna právo mít stejný přístup k webu a stejný přístup k adresáři, připojit se zpět k lokalitě jejího původu a číst z instalačního adresáře. Ve výchozím nastavení je zóna internetu udělena pouze právo připojit se zpět k lokalitě jejího původu.

Uživatelem zadané soubory

Jedním ze způsobů, jak řešit, že nemáte oprávnění k přístupu k souborům, je vyzvat uživatele, aby zadal konkrétní informace o souboru pomocí OpenFileDialog třídy nebo SaveFileDialog třídy. Tato interakce uživatele pomáhá zajistit, že aplikace nemůže načíst soukromé soubory se zlými úmysly ani přepsat důležité soubory. OpenFile Metody OpenFile poskytují přístup k souboru pro čtení a zápis otevřením datového proudu souboru, který uživatel zadal. Tyto metody také pomáhají chránit soubor uživatele tím, že zakrývá cestu k souboru.

Poznámka:

Tato oprávnění se liší v závislosti na tom, jestli je vaše aplikace v zóně Internetu nebo intranetu. Aplikace internetové zóny mohou používat OpenFileDialogpouze aplikace , zatímco intranetové aplikace mají neomezené oprávnění dialogového okna souboru.

Třída FileDialogPermission určuje, jaký typ dialogového okna souboru může vaše aplikace použít. Následující tabulka uvádí hodnotu, kterou musíte použít pro každou FileDialog třídu.

Třída Požadovaná hodnota přístupu
OpenFileDialog Open
SaveFileDialog Save

Poznámka:

Konkrétní oprávnění se nevyžaduje, dokud OpenFile se metoda skutečně nevolá.

Oprávnění k zobrazení dialogového okna souboru neuděluje aplikaci úplný přístup všem členům FileDialog, OpenFileDialoga SaveFileDialog tříd. Přesná oprávnění potřebná k volání jednotlivých metod najdete v referenčním tématu pro danou metodu v dokumentaci knihovny tříd rozhraní .NET Framework.

Následující příklad kódu používá metodu OpenFile k otevření souboru zadaného uživatelem RichTextBox do ovládacího prvku. Příklad vyžaduje FileDialogPermission a přidruženou Open hodnotu výčtu. Příklad ukazuje, jak zpracovat SecurityException , aby bylo možné určit, zda má být funkce ukládání zakázána. Tento příklad vyžaduje, aby váš FormButton ovládací prvek s názvem ButtonOpen, a ovládací prvek RichTextBox s názvem RtfBoxMain.

Poznámka:

V příkladu se nezobrazuje programovací logika pro funkci ukládání.

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;  
            }  
        }  
    }  
}  

Poznámka:

V jazyce Visual C# se ujistěte, že přidáte kód pro povolení obslužné rutiny události. Pomocí kódu z předchozího příkladu ukazuje následující kód, jak povolit obslužnou rutinu události.this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);

Jiné soubory

Někdy budete muset číst nebo zapisovat do souborů, které uživatel nezadá, například když musíte zachovat nastavení aplikace. V místním intranetu a internetových zónách nebude mít vaše aplikace oprávnění k ukládání dat v místním souboru. Vaše aplikace ale bude moct ukládat data v izolovaném úložišti. Izolované úložiště je abstraktní datový oddíl (nikoli konkrétní umístění úložiště), který obsahuje jeden nebo více izolovaných souborů úložiště, označovaných jako úložiště, které obsahují skutečná umístění adresáře, kde jsou uložená data. Přístupová oprávnění k souborům, jako FileIOPermission jsou nepožadovaná. IsolatedStoragePermission Třída místo toho řídí oprávnění pro izolované úložiště. Ve výchozím nastavení můžou aplikace spuštěné v místním intranetu a internetových zónách ukládat data pomocí izolovaného úložiště; nastavení, jako je kvóta disku, se ale může lišit. Další informace o izolovaném úložišti najdete v tématu Izolované úložiště.

Následující příklad používá izolované úložiště k zápisu dat do souboru umístěného v úložišti. Příklad vyžaduje IsolatedStorageFilePermission a hodnotu výčtu DomainIsolationByUser . Příklad ukazuje čtení a zápis určitých hodnot Button vlastností ovládacího prvku do souboru v izolovaném úložišti. Funkce Read by byla volána po spuštění aplikace a Write funkce by byla volána před ukončením aplikace. Příklad vyžaduje, aby ReadWrite funkce existovaly jako členové Form ovládacího prvku s Button názvem 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();  
    }  
}  

Přístup k databázi

Oprávnění potřebná pro přístup k databázi se liší v závislosti na poskytovateli databáze; Pouze aplikace, které jsou spuštěné s příslušnými oprávněními, ale mají přístup k databázi prostřednictvím datového připojení. Další informace o oprávněních potřebných pro přístup k databázi najdete v tématu Zabezpečení přístupu kódu a ADO.NET.

Pokud nemáte přímý přístup k databázi, protože chcete, aby vaše aplikace běžela v částečném vztahu důvěryhodnosti, můžete k přístupu k datům použít webovou službu. Webová služba je software, ke kterému se dá programově přistupovat přes síť. S webovými službami můžou aplikace sdílet data napříč zónami skupin kódu. Ve výchozím nastavení mají aplikace v místním intranetu a internetových zónách právo pro přístup ke svým webům původu, což jim umožňuje volat webovou službu hostované na stejném serveru. Další informace naleznete v tématu Webové služby v ASP.NET AJAX nebo Windows Communication Foundation.

Přístup k registru

Třída RegistryPermission řídí přístup k registru operačního systému. Ve výchozím nastavení mají k registru přístup jenom aplikace, které běží místně. RegistryPermission uděluje aplikaci právo vyzkoušet přístup k registru; nezaručuje, že přístup bude úspěšný, protože operační systém stále vynucuje zabezpečení v registru.

Vzhledem k tomu, že nemůžete získat přístup k registru v rámci částečné důvěryhodnosti, možná budete muset najít další metody ukládání dat. Při ukládání nastavení aplikace použijte izolované úložiště místo registru. Izolované úložiště lze také použít k ukládání jiných souborů specifických pro aplikaci. Můžete také uložit informace o globální aplikaci o serveru nebo lokalitě původu, protože ve výchozím nastavení má aplikace právo pro přístup k lokalitě jejího původu.

Viz také