Aracılığıyla paylaş


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 okuyabileceği veya yazabileceği yer, 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şme yönteminizi değiştirmeniz gerekebilir.

Bir güvenlik kısıtlaması ile karşılaştığınızda iki seçeneğiniz vardır: izni onaylama (uygulamanıza verildiği varsayılarak) veya kısmi güven içinde ç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çıklanır.

Dekont

Varsayılan olarak, ClickOnce dağıtımları oluşturan araçlar bu dağıtımları, üzerinde çalıştıkları bilgisayarlardan Tam Güven istemek için varsayılan olarak kullanır. Kısmi güven içinde çalıştırmanın ek güvenlik avantajlarını istediğinize karar verirseniz, Visual Studio'da veya Windows SDK araçlarından birinde (Mage.exe veya MageUI.exe) bu varsayılanı değiştirmeniz gerekir. Windows Forms güvenliği ve uygulamanız için uygun güven düzeyini belirleme hakkında daha fazla bilgi için bkz . Windows Forms'da Güvenliğe Genel Bakış.

Dosya Erişimi

sınıfı . FileIOPermission NET Framework'te dosya ve klasör erişimini denetler. Varsayılan olarak, güvenlik sistemi yerel intranet ve İnternet bölgeleri gibi kısmi güven ortamlarına izni FileIOPermission vermez. Ancak, uygulamanızın tasarımını değiştirirseniz veya dosyalara erişmek için farklı yöntemler kullanırsanız, dosya erişimi gerektiren bir uygulama bu ortamlarda çalışmaya devam edebilir. Varsayılan olarak, yerel intranet bölgesine aynı site erişimine ve aynı dizin erişimine sahip olma, kaynağının sitesine geri bağlanma ve yükleme dizininden okuma hakkı verilir. Varsayılan olarak, İnternet bölgesine yalnızca kaynağının sitesine yeniden bağlanma hakkı verilir.

Kullanıcı Tarafından Belirtilen Dosyalar

Dosya erişim iznine sahip olmamasıyla başa çıkmanın bir yolu, kullanıcıdan veya SaveFileDialog sınıfını kullanarak belirli dosya bilgilerini sağlamasını istemenizdirOpenFileDialog. Bu kullanıcı etkileşimi, uygulamanın kötü amaçlı olarak özel dosyaları yükleyemeyeceği veya önemli dosyaların üzerine yazamayacağına ilişkin bir güvence sağlamaya yardımcı olur. OpenFile ve OpenFile yöntemleri, kullanıcının belirttiği dosya için dosya akışını açarak okuma ve yazma dosyası erişimi sağlar. Yöntemler, dosyanın yolunu gizleyerek kullanıcının dosyasını korumaya da yardımcı olur.

Dekont

Bu izinler, uygulamanızın İnternet bölgesinde mi yoksa İntranet bölgesinde mi olduğuna bağlı olarak farklılık gösterir. İnternet bölgesi uygulamaları yalnızca kullanabilirken OpenFileDialogIntranet uygulamaları kısıtlanmamış dosya iletişim kutusu iznine sahiptir.

sınıfı, FileDialogPermission uygulamanızın kullanabileceği dosya türü iletişim kutusunu belirtir. Aşağıdaki tabloda her FileDialog sınıfı kullanmanız gereken değer gösterilmektedir.

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

Dekont

Yöntem gerçekten çağrılana OpenFile kadar belirli izin istenmiyor.

Dosya görüntüleme izni iletişim kutusu, uygulamanıza , OpenFileDialogve SaveFileDialog sınıflarının FileDialogtüm üyelerine tam erişim vermez. 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, kullanıcı tarafından belirtilen bir dosyayı bir RichTextBox denetime açmak için yöntemini kullanırOpenFile. Örnek için ve ilişkili Open sabit listesi değeri gerekirFileDialogPermission. Örnek, kaydetme özelliğinin SecurityException devre dışı bırakılıp bırakılmayacağını belirlemek için öğesinin nasıl işleneceğini gösterir. Bu örnek, adlı bir Button denetiminizin ve adlı RtfBoxMainButtonOpenbir RichTextBox denetiminizin Form olmasını gerektirir.

Dekont

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

Dekont

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

Diğer Dosyalar

Bazen, uygulama ayarlarını kalıcı hale getirmek zorunda olduğunuz durumlar gibi kullanıcının belirtmediği dosyaları okumanız veya yazmanız gerekir. Yerel intranet ve İnternet bölgelerinde uygulamanızın verileri yerel bir dosyada depolama izni olmaz. Ancak uygulamanız verileri yalıtılmış depolamada depolayabilecektir. Yalıtılmış depolama, verilerin depolandığı gerçek dizin konumlarını içeren depolar olarak adlandırılan bir veya daha fazla yalıtılmış depolama dosyası içeren soyut bir veri bölmesidir (belirli bir depolama konumu değildir). gibi FileIOPermission dosya erişim izinleri gerekli değildir; bunun yerine, IsolatedStoragePermission sınıf yalıtılmış depolama izinlerini denetler. Varsayılan olarak, yerel intranet ve İnternet bölgelerinde çalışan uygulamalar yalıtılmış depolama kullanarak verileri depolayabilir; 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. Örnek için ve DomainIsolationByUser numaralandırma değeri gerekirIsolatedStorageFilePermission. Örnek, denetimin belirli özellik değerlerini Button yalıtılmış depolamadaki bir dosyaya okuma ve yazma işlemini gösterir. İşlev, Read uygulama başlatıldıktan sonra çağrılır ve Write uygulama sona ermeden önce çağrılır. Örnek, ve işlevlerinin Read adlı MainButtonbir denetimi içeren bir ButtonForm öğesinin üyeleri olarak Write mevcut olmasını gerektirir.

' 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şir; ancak, yalnızca uygun izinlerle çalışan uygulamalar bir veri bağlantısı üzerinden veritabanına erişebilir. Veritabanına erişmek için gereken izinler hakkında daha fazla bilgi için bkz . Kod Erişim Güvenliği ve ADO.NET.

Uygulamanızın kısmi güven içinde çalışmasını istediğiniz için veritabanına doğrudan erişemiyorsanız, verilerinize erişmek için alternatif bir araç olarak bir Web hizmeti kullanabilirsiniz. Web hizmeti, ağ üzerinden program aracılığıyla erişilebilen bir yazılım parçasıdır. Web hizmetleriyle, uygulamalar kod grubu bölgeleri arasında veri paylaşabilir. Varsayılan olarak, yerel intranet ve İnternet bölgelerindeki uygulamalara kaynak sitelerine erişme hakkı verilir ve bu da aynı sunucuda barındırılan bir Web hizmetini çağırmalarına olanak tanır. Daha fazla bilgi için bkz. ASP.NET AJAX veya Windows Communication Foundation'da Web Hizmetleri.

Kayıt Defteri Erişimi

sınıfı, RegistryPermission işletim sistemi kayıt defterine erişimi denetler. Varsayılan olarak, kayıt defterine yalnızca yerel olarak çalışan uygulamalar erişebilir. RegistryPermission yalnızca bir uygulamaya kayıt defteri erişimini deneme hakkı verir; işletim sistemi kayıt defterinde güvenliği yine de zorladığı için erişimin başarılı olacağını garanti etmez.

Kayıt defterine kısmi güven altında erişemediğinizden, verilerinizi depolamak için başka yöntemler 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 kaynağının sitesine erişim hakkı verildiğinden, kaynak sunucu veya site hakkındaki genel uygulama bilgilerini de depolayabilirsiniz.

Ayrıca bkz.