Windows Forms'ta Daha Güvenli Dosya ve Veri Erişimi

.NET Framework, kaynakları ve verileri korumaya yardımcı olmak için izinleri kullanır. Uygulamanızın verileri okuyabildiği veya yazabileceği, uygulamaya verilen izinlere bağlıdır. Uygulamanız kısmi bir güven ortamında çalıştığında verilerinize erişiminiz olmayabilir veya verilere erişirken kullandığınız yolu değiştirmeniz gerekebilir.

Bir güvenlik kısıtlamasından karşılaştığınızda, iki seçeneğiniz vardır: izni onaylayın (uygulamanıza verildiği varsayılarak) veya kısmi güvende çalışmak için yazılmış özelliğin bir sürümünü kullanın. Aşağıdaki bölümlerde, kısmi güven ortamında çalışan uygulamalardan dosya, veritabanı ve kayıt defteri erişimiyle nasıl çalışılacağı açıklanmaktadır.

Not

varsayılan olarak, ClickOnce dağıtımlar oluşturan araçlar, çalıştırdığı bilgisayarlardan tam güven istemek için bu dağıtımları varsayılan olarak alır. kısmi güvende çalıştırmanın ek güvenlik avantajlarından yararlanmak istiyorsanız, bu varsayılanı Visual Studio veya Windows SDK araçlarından birinde (Mage.exe ya da MageUI.exe) değiştirmeniz gerekir. Windows Forms güvenliği hakkında daha fazla bilgi için ve uygulamanız için uygun güven düzeyini belirleme hakkında daha fazla bilgi için bkz. security in Windows Forms Overview.

Dosya erişimi

FileIOPermissionSınıfı, .NET Framework dosya ve klasör erişimini denetler. Varsayılan olarak, güvenlik sistemi, FileIOPermission Yerel intranet ve Internet bölgeleri gibi kısmi güven ortamlarına izin vermez. Ancak, uygulamanızın tasarımını değiştirirseniz veya dosyalara erişmek için farklı yöntemler kullanıyorsanız, dosya erişimi gerektiren bir uygulama bu ortamlarda hala çalışabilir. Varsayılan olarak, yerel intranet bölgesine aynı site erişimi ve aynı dizin erişimine sahip olmak, kaynağının sitesine geri bağlanmak ve yükleme dizininden okumak için hakkı verilir. Varsayılan olarak, Internet bölgesine yalnızca kendi başlangıç sitesine geri bağlanma hakkı verilir.

User-Specified dosyaları

Dosya erişimi iznine sahip olmayan bir yol, kullanıcıdan veya sınıfını kullanarak belirli dosya bilgilerini sağlamasını istesağlamaktır OpenFileDialog SaveFileDialog . Bu Kullanıcı etkileşimi, uygulamanın özel dosyaları kötü amaçlı olarak yükleyemayacağı veya önemli dosyaların üzerine yazabileceği bazı güvence sağlanmasına yardımcı olur. OpenFileVe OpenFile yöntemleri, kullanıcının belirlediği dosyanın dosya akışını açarak okuma ve yazma dosya erişimi sağlar. Yöntemler, dosyanın yolunu obscuring ile kullanıcının dosyasının korunmasına da yardımcı olur.

Not

Bu izinler, uygulamanızın Internet bölgesinde mi yoksa Intranet bölgesinde mı olduğuna bağlı olarak farklılık gösterir. Internet bölgesi uygulamaları yalnızca kullanabilir OpenFileDialog , ancak Intranet uygulamalarında sınırsız dosya iletişim kutusu izni vardır.

Sınıfı, uygulamanız tarafından kullanılabilecek FileDialogPermission dosya iletişim kutusu türünü belirtir. Aşağıdaki tabloda her bir sınıfı kullanmak için sahip olmanız gereken değer gösterilmektedir FileDialog .

Sınıf Gerekli erişim değeri
OpenFileDialog Open
SaveFileDialog Save

Not

Yöntem gerçekte çağrılana kadar belirli izin istenmez OpenFile .

Dosya iletişim kutusu görüntüleme izni FileDialog , uygulamanıza, OpenFileDialog ve sınıflarının tüm üyelerine tam erişim vermez SaveFileDialog . her yöntemi çağırmak için gereken tam izinler için, .NET Framework sınıf kitaplığı belgelerindeki bu yöntemin başvuru konusuna bakın.

Aşağıdaki kod örneği, OpenFile Kullanıcı tarafından belirtilen bir dosyayı denetimde açmak için yöntemini kullanır RichTextBox . Örneğin, FileDialogPermission ve ilişkili Open numaralandırma değeri gereklidir. Örnek, SecurityException Kaydet özelliğinin devre dışı bırakılıp bırakılmadığını belirlemede nasıl işleneceğini gösterir. Bu örnek Form , adlı bir Button denetime ButtonOpen ve RichTextBox adlı bir denetime sahip RtfBoxMain olmanızı gerektirir.

Not

Kaydet özelliğinin programlama mantığı örnekte gösterilmez.

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

Not

Visual C# ' de, olay işleyicisini etkinleştirmek için kod eklemediğinizden emin olun. Önceki örnekteki kodu kullanarak, aşağıdaki kodda olay işleyicisinin nasıl etkinleştirileceği gösterilmektedir.this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);

Diğer Dosyalar

Bazen, uygulama ayarlarını kalıcı hale getirmeniz gerektiğinde, kullanıcının belirtmeyen dosyaları okumanız veya yazmanız gerekir. Yerel intranet ve Internet bölgelerinde, uygulamanızın verileri yerel bir dosyada depolama izni olmayacaktır. Ancak, uygulamanız verileri yalıtılmış depolamada depolayabilecektir. Yalıtılmış depolama, verilerin depolandığı gerçek dizin konumlarını içeren depolar adlı bir veya daha fazla yalıtılmış depolama dosyası içeren bir soyut veri bölmesi 'dir (belirli bir depolama konumu değildir). Gibi dosya erişim izinleri FileIOPermission gerekli değildir; Bunun yerine, IsolatedStoragePermission sınıfı yalıtılmış depolama için izinleri denetler. Varsayılan olarak, yerel intranet ve Internet bölgelerinde çalışan uygulamalar, yalıtılmış depolama kullanarak veri saklayabilir; Ancak, disk kotası gibi ayarlar farklılık gösterebilir. yalıtılmış depolama hakkında daha fazla bilgi için bkz. yalıtılmış Depolama.

Aşağıdaki örnek, bir depoda bulunan bir dosyaya veri yazmak için yalıtılmış depolamayı kullanır. Örneğin, IsolatedStorageFilePermission ve DomainIsolationByUser numaralandırma değeri gereklidir. Örnek, denetimin bazı özellik değerlerini, Button yalıtılmış depolamada bulunan bir dosyaya okumayı ve yazmayı gösterir. Readİşlev uygulama başladıktan sonra çağrılır ve Write uygulama bitmeden önce işlev çağırılır. Örnek, Read ve Write işlevlerinin adlı bir denetim içeren üyesi olarak var olmasını gerektirir Form Button 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();  
    }  
}  

Veritabanı Erişimi

Veritabanına erişmek için gereken izinler veritabanı sağlayıcısına göre değişiklik gösterir; Ancak, yalnızca uygun izinlerle çalışan uygulamalar, bir veritabanına veri bağlantısı aracılığıyla erişebilir. Veritabanına erişmek için gereken izinler hakkında daha fazla bilgi için bkz. kod erişimi güvenliği ve ADO.net.

Uygulamanızın kısmi güvende çalışmasını istediğiniz için doğrudan bir veritabanına erişemiyorsanız, verilerinize erişmek için alternatif bir yöntem olarak Web hizmetini kullanabilirsiniz. Web hizmeti, bir ağ üzerinden programlı bir şekilde erişilebilen bir yazılım parçasıdır. Web hizmetleriyle, uygulamalar, kod grubu bölgelerinde veri paylaşabilir. Varsayılan olarak, yerel intranet ve Internet bölgelerindeki uygulamalara kendi kaynak sitelerine erişme hakkı verilir ve bu da aynı sunucuda barındırılan bir Web hizmetini çağırabilir. daha fazla bilgi için bkz. ASP.NET AJAX veya Windows Communication Foundation Web hizmetleri .

Kayıt defteri erişimi

RegistryPermissionSınıfı, işletim sistemi kayıt defterine erişimi denetler. Varsayılan olarak, yalnızca yerel olarak çalışan uygulamalar kayıt defterine erişebilir. RegistryPermission yalnızca bir uygulamaya kayıt defteri erişimini deneme hakkı verir; işletim sistemi hala kayıt defteri üzerinde güvenlik uyguladığından, erişimin başarılı olacağını garanti etmez.

Kısmi güven altında kayıt defterine erişemediği için, verilerinizi depolamanın diğer yöntemlerini bulmanız gerekebilir. Uygulama ayarlarını depoladığınızda kayıt defteri yerine yalıtılmış depolama kullanın. Yalıtılmış depolama, uygulamaya özgü diğer dosyaları depolamak için de kullanılabilir. Ayrıca, varsayılan olarak bir uygulamaya kendi başlangıç sitesine erişim hakkı verildiği için, sunucu veya kaynak sitesiyle ilgili genel uygulama bilgilerini de saklayabilirsiniz.

Ayrıca bkz.