Dela via


Säkrare fil- och dataåtkomst i Windows-formulär

.NET Framework använder behörigheter för att skydda resurser och data. Var ditt program kan läsa eller skriva data beror på vilka behörigheter som beviljats programmet. När programmet körs i en partiell förtroendemiljö kanske du inte har åtkomst till dina data eller så kanske du måste ändra hur du kommer åt data.

När du stöter på en säkerhetsbegränsning har du två alternativ: kontrollera behörigheten (förutsatt att den har beviljats till ditt program) eller använda en version av funktionen som skrivits för att fungera i partiellt förtroende. I följande avsnitt beskrivs hur du arbetar med fil-, databas- och registeråtkomst från program som körs i en partiell förtroendemiljö.

Not

Som standard är verktyg som genererar ClickOnce-distributioner konfigurerade så att dessa distributioner begär fullständigt förtroende från de datorer de körs på. Om du bestämmer dig för att du vill ha de extra säkerhetsfördelarna med att köra i partiellt förtroende måste du ändra den här standardinställningen i antingen Visual Studio eller något av Windows SDK-verktygen (Mage.exe eller MageUI.exe). Mer information om Säkerhet i Windows Forms och hur du fastställer lämplig förtroendenivå för ditt program finns i Säkerhet i Windows Forms Översikt.

Filåtkomst

Klassen FileIOPermission styr fil- och mappåtkomst i .NET Framework. Säkerhetssystemet beviljar som standard inte FileIOPermission till partiella förtroendemiljöer som det lokala intranätet och Internetzonerna. Ett program som kräver filåtkomst kan dock fortfarande fungera i dessa miljöer om du ändrar programmets design eller använder olika metoder för att komma åt filer. Som standard beviljas den lokala intranätzonen rätt att ha samma platsåtkomst och samma katalogåtkomst, att ansluta tillbaka till platsen för dess ursprung och att läsa från installationskatalogen. Som standard beviljas Internetzonen endast rätt att ansluta tillbaka till platsen där den har sitt ursprung.

User-Specified-filer

Ett sätt att hantera att inte ha filåtkomstbehörighet är att uppmana användaren att ange specifik filinformation med hjälp av klassen OpenFileDialog eller SaveFileDialog. Den här användarinteraktionen hjälper till att garantera att programmet inte kan läsa in privata filer eller skriva över viktiga filer. Metoderna OpenFile och OpenFile ger läs- och skrivfilåtkomst genom att öppna filströmmen för filen som användaren angav. Metoderna hjälper också till att skydda användarens fil genom att dölja filens sökväg.

Not

Dessa behörigheter varierar beroende på om ditt program finns i Internetzonen eller intranätzonen. Program i zonen Internet kan bara använda OpenFileDialog, medan intranätprogram har obegränsad behörighet för fildialogrutan.

Klassen FileDialogPermission anger vilken typ av fildialogruta som programmet kan använda. I följande tabell visas det värde som du måste ha för att använda varje FileDialog-klass.

Klass Nödvändigt åtkomstvärde
OpenFileDialog Open
SaveFileDialog Save

Not

Den specifika behörigheten begärs inte förrän metoden OpenFile faktiskt anropas.

Behörighet att visa en fildialogruta ger inte programmet fullständig åtkomst till alla medlemmar i klasserna FileDialog, OpenFileDialogoch SaveFileDialog. De exakta behörigheter som krävs för att anropa varje metod finns i referensavsnittet för den metoden i dokumentationen för .NET Framework-klassbiblioteket.

I följande kodexempel används metoden OpenFile för att öppna en användardefinerad fil i en RichTextBox kontroll. Exemplet kräver FileDialogPermission och det associerade Open uppräkningsvärdet. Exemplet visar hur du hanterar SecurityException för att avgöra om spara-funktionen ska inaktiveras. Det här exemplet kräver att din Form har en Button-kontroll med namnet ButtonOpenoch en RichTextBox-kontroll med namnet RtfBoxMain.

Observera

Programmeringslogik för spara-funktionen visas inte i exemplet.

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

Notera

I Visual C# kontrollerar du att du lägger till kod för att aktivera händelsehanteraren. Med hjälp av koden från föregående exempel visar följande kod hur du aktiverar händelsehanteraren.this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);

Andra filer

Ibland måste du läsa eller skriva till filer som användaren inte anger, till exempel när du måste spara programinställningar. I de lokala intranät- och Internetzonerna har ditt program inte behörighet att lagra data i en lokal fil. Ditt program kommer dock att kunna lagra data i isolerad lagring. Isolerad lagring är ett abstrakt datautrymme (inte en specifik lagringsplats) som innehåller en eller flera isolerade lagringsfiler, så kallade arkiv, som innehåller de faktiska katalogplatser där data lagras. Filåtkomstbehörigheter som FileIOPermission krävs inte. I stället styr klassen IsolatedStoragePermission behörigheterna för isolerad lagring. Som standard kan program som körs i de lokala intranät- och Internetzonerna lagra data med hjälp av isolerad lagring. Inställningar som diskkvot kan dock variera. Mer information om isolerad lagring finns i Isolerad lagring.

I följande exempel används isolerad lagring för att skriva data till en fil som finns i ett arkiv. Exemplet kräver IsolatedStorageFilePermission och DomainIsolationByUser uppräkningsvärdet. Exemplet visar läsning och skrivning av vissa egenskapsvärden för Button kontroll till en fil i isolerad lagring. Funktionen Read anropas när programmet startas och funktionen Write anropas innan programmet avslutas. Exemplet kräver att funktionerna Read och Write finns som medlemmar i en Form som innehåller en Button kontroll med namnet 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();  
    }  
}  

Databasåtkomst

Vilka behörigheter som krävs för att komma åt en databas varierar beroende på databasprovidern. Men endast program som körs med rätt behörigheter kan komma åt en databas via en dataanslutning. Mer information om de behörigheter som krävs för att komma åt en databas finns i Code Access Security och ADO.NET.

Om du inte kan komma åt en databas direkt eftersom du vill att programmet ska köras delvis kan du använda en webbtjänst som ett alternativt sätt att komma åt dina data. En webbtjänst är en programvara som kan användas programmatiskt via ett nätverk. Med webbtjänster kan program dela data mellan kodgruppszoner. Som standard beviljas program i det lokala intranätet och Internetzonerna rätt att få åtkomst till sina ursprungswebbplatser, vilket gör att de kan anropa en webbtjänst som finns på samma server. Mer information finns i Web Services i ASP.NET AJAX eller Windows Communication Foundation.

Registeråtkomst

Klassen RegistryPermission styr åtkomsten till operativsystemets register. Som standard kan endast program som körs lokalt komma åt registret. RegistryPermission ger endast ett program rätt att prova registeråtkomst. det garanterar inte att åtkomsten lyckas, eftersom operativsystemet fortfarande framtvingar säkerheten i registret.

Eftersom du inte kan komma åt registret med delvis förtroende kan du behöva hitta andra metoder för att lagra dina data. När du lagrar programinställningar använder du isolerad lagring i stället för registret. Isolerad lagring kan också användas för att lagra andra programspecifika filer. Du kan också lagra global programinformation om servern eller ursprungsplatsen, eftersom ett program som standard beviljas behörighet att komma åt platsen för dess ursprung.

Se även