Bagikan melalui


Akses File dan Data yang Lebih Aman di Formulir Windows

.NET Framework menggunakan izin untuk membantu melindungi sumber daya dan data. Di mana aplikasi Anda dapat membaca atau menulis data tergantung pada izin yang diberikan ke aplikasi. Saat aplikasi Anda berjalan di lingkungan kepercayaan parsial, Anda mungkin tidak memiliki akses ke data Anda atau Anda mungkin harus mengubah cara Anda mengakses data.

Ketika Anda mengalami pembatasan keamanan, Anda memiliki dua opsi: menegaskan izin (dengan asumsi telah diberikan ke aplikasi Anda), atau gunakan versi fitur yang ditulis untuk bekerja dalam kepercayaan parsial. Bagian berikut membahas cara bekerja dengan akses file, database, dan registri dari aplikasi yang berjalan di lingkungan kepercayaan parsial.

Catatan

Secara default, alat yang menghasilkan penyebaran ClickOnce default penyebaran ini untuk meminta Kepercayaan Penuh dari komputer tempat penyebaran dijalankan. Jika Anda memutuskan ingin menambahkan manfaat keamanan yang berjalan dalam kepercayaan parsial, Anda harus mengubah default ini di Visual Studio atau salah satu alat Windows SDK (Mage.exe atau MageUI.exe). Untuk informasi selengkapnya tentang keamanan Formulir Windows, dan tentang cara menentukan tingkat kepercayaan yang sesuai untuk aplikasi Anda, lihat Keamanan dalam Gambaran Umum Formulir Windows.

Akses File

Kelas FileIOPermission mengontrol akses file dan folder di .NET Framework. Secara default, sistem keamanan tidak memberikan FileIOPermission ke lingkungan kepercayaan parsial seperti intranet lokal dan zona Internet. Namun, aplikasi yang memerlukan akses file masih dapat berfungsi di lingkungan ini jika Anda memodifikasi desain aplikasi Anda atau menggunakan metode yang berbeda untuk mengakses file. Secara default, zona intranet lokal diberikan hak untuk memiliki akses situs yang sama dan akses direktori yang sama, untuk menyambungkan kembali ke situs asalnya, dan membaca dari direktori penginstalannya. Secara default, zona Internet, hanya diberikan hak untuk terhubung kembali ke situs asalnya.

File yang Ditentukan Pengguna

Salah satu cara untuk menangani tidak memiliki izin akses file adalah dengan meminta pengguna untuk memberikan informasi file tertentu dengan menggunakan OpenFileDialog kelas atau SaveFileDialog . Interaksi pengguna ini membantu memberikan beberapa jaminan bahwa aplikasi tidak dapat memuat file privat dengan berbahaya atau menimpa file penting. Metode OpenFile dan OpenFile menyediakan akses file baca dan tulis dengan membuka aliran file untuk file yang ditentukan pengguna. Metode ini juga membantu melindungi file pengguna dengan mengaburkan jalur file.

Catatan

Izin ini berbeda tergantung pada apakah aplikasi Anda berada di zona Internet atau zona Intranet. Aplikasi zona internet hanya dapat menggunakan OpenFileDialog, sedangkan aplikasi Intranet memiliki izin dialog file yang tidak dibatasi.

Kelas FileDialogPermission menentukan jenis kotak dialog file apa yang dapat digunakan aplikasi Anda. Tabel berikut ini memperlihatkan nilai yang harus Anda gunakan untuk setiap FileDialog kelas.

Kelas Nilai akses yang diperlukan
OpenFileDialog Open
SaveFileDialog Save

Catatan

Izin khusus tidak diminta sampai OpenFile metode benar-benar dipanggil.

Izin untuk menampilkan kotak dialog file tidak memberikan aplikasi Anda akses penuh ke semua anggota FileDialogkelas , , OpenFileDialogdan SaveFileDialog . Untuk izin yang tepat yang diperlukan untuk memanggil setiap metode, lihat topik referensi untuk metode tersebut dalam dokumentasi pustaka kelas .NET Framework.

Contoh kode berikut menggunakan OpenFile metode untuk membuka file yang ditentukan pengguna ke dalam RichTextBox kontrol. Contoh memerlukan FileDialogPermission dan nilai enumerasi terkait Open . Contoh menunjukkan cara menangani SecurityException untuk menentukan apakah fitur simpan harus dinonaktifkan. Contoh ini mengharuskan Anda Form memiliki Button kontrol bernama ButtonOpen, dan RichTextBox kontrol bernama RtfBoxMain.

Catatan

Logika pemrograman untuk fitur simpan tidak ditampilkan dalam contoh.

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

Catatan

Di Visual C#, pastikan Anda menambahkan kode untuk mengaktifkan penanganan aktivitas. Dengan menggunakan kode dari contoh sebelumnya, kode berikut menunjukkan cara mengaktifkan penanganan aktivitas.this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);

File Lainnya

Terkadang Anda perlu membaca atau menulis ke file yang tidak ditentukan pengguna, seperti ketika Anda harus mempertahankan pengaturan aplikasi. Di intranet lokal dan zona Internet, aplikasi Anda tidak akan memiliki izin untuk menyimpan data dalam file lokal. Namun, aplikasi Anda akan dapat menyimpan data dalam penyimpanan terisolasi. Penyimpanan terisolasi adalah kompartemen data abstrak (bukan lokasi penyimpanan tertentu) yang berisi satu atau beberapa file penyimpanan terisolasi, yang disebut penyimpanan, yang berisi lokasi direktori aktual tempat data disimpan. Izin akses file seperti FileIOPermission tidak diperlukan; sebaliknya, IsolatedStoragePermission kelas mengontrol izin untuk penyimpanan yang terisolasi. Secara default, aplikasi yang berjalan di intranet lokal dan zona Internet dapat menyimpan data menggunakan penyimpanan terisolasi; namun, pengaturan seperti kuota disk dapat bervariasi. Untuk informasi selengkapnya tentang penyimpanan terisolasi, lihat Penyimpanan Terisolasi.

Contoh berikut menggunakan penyimpanan terisolasi untuk menulis data ke file yang terletak di penyimpanan. Contoh memerlukan IsolatedStorageFilePermission dan DomainIsolationByUser nilai enumerasi. Contoh menunjukkan membaca dan menulis nilai properti tertentu dari Button kontrol ke file dalam penyimpanan terisolasi. Fungsi Read akan dipanggil setelah aplikasi dimulai dan Write fungsi akan dipanggil sebelum aplikasi berakhir. Contoh mengharuskan Read fungsi dan Write ada sebagai anggota Form yang berisi Button kontrol bernama 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();  
    }  
}  

Akses Database

Izin yang diperlukan untuk mengakses database bervariasi berdasarkan penyedia database; namun, hanya aplikasi yang berjalan dengan izin yang sesuai yang dapat mengakses database melalui koneksi data. Untuk informasi selengkapnya tentang izin yang diperlukan untuk mengakses database, lihat Keamanan Akses Kode dan ADO.NET.

Jika Anda tidak dapat langsung mengakses database karena Anda ingin aplikasi Anda berjalan dalam kepercayaan parsial, Anda bisa menggunakan layanan Web sebagai cara alternatif untuk mengakses data Anda. Layanan Web adalah perangkat lunak yang dapat diakses secara terprogram melalui jaringan. Dengan layanan Web, aplikasi dapat berbagi data di seluruh zona grup kode. Secara default, aplikasi di intranet lokal dan zona Internet diberikan hak untuk mengakses situs asalnya, yang memungkinkan mereka memanggil layanan Web yang dihosting di server yang sama. Untuk informasi selengkapnya, lihat Layanan Web di ASP.NET AJAX atau Windows Communication Foundation.

Akses Registri

Kelas RegistryPermission mengontrol akses ke registri sistem operasi. Secara default, hanya aplikasi yang berjalan secara lokal yang dapat mengakses registri. RegistryPermission hanya memberi aplikasi hak untuk mencoba akses registri; itu tidak menjamin akses akan berhasil, karena sistem operasi masih memberlakukan keamanan pada registri.

Karena Anda tidak dapat mengakses registri di bawah kepercayaan parsial, Anda mungkin perlu menemukan metode lain untuk menyimpan data Anda. Saat Anda menyimpan pengaturan aplikasi, gunakan penyimpanan terisolasi alih-alih registri. Penyimpanan terisolasi juga dapat digunakan untuk menyimpan file khusus aplikasi lainnya. Anda juga dapat menyimpan informasi aplikasi global tentang server atau situs asal, karena secara default aplikasi diberikan hak untuk mengakses situs asalnya.

Baca juga