The private
pengubah digunakan untuk membatasi akses luar kelas, tetapi menggunakan refleksi kelas lain dapat mengakses metode pribadi dan bidang. Jadi saya bertanya-tanya bagaimana kita dapat membatasi aksesibilitas jika itu merupakan bagian dari persyaratan.
security
reflection
pengguna245930
sumber
sumber
Jawaban:
Tujuan pengubah akses adalah untuk memberi tahu pengembang menulis kode tentang apa yang dimaksud dengan antarmuka publik kelas. Mereka tidak dengan cara apa pun mengukur keamanan dan mereka tidak benar-benar menyembunyikan atau mengamankan informasi apa pun.
sumber
Mengutip Herb Sutter tentang hak akses kelas :
"Masalahnya di sini adalah melindungi terhadap Murphy vs. melindungi terhadap Machiavelli ... yaitu, melindungi dari penyalahgunaan yang tidak disengaja (yang bahasa ini sangat baik) vs melindungi dari penyalahgunaan yang disengaja (yang secara efektif tidak mungkin). Pada akhirnya, jika seorang programmer sangat ingin menumbangkan sistem, dia akan menemukan cara "
sumber
#define private public
(mengabaikan bahwa itu sebenarnya Perilaku Tidak Terdefinisi) dan voila saya memiliki akses penuh dari luar ke bagian terbatas dari kelas Anda.Tidak, ini sebenarnya keuntungan penting. Hanya karena beberapa pengembang tidak menganggap bahwa siapa pun akan memerlukan akses ke keadaan internal tidak berarti bahwa tidak ada kasus penggunaan yang sah yang akan muncul. Dalam kasus ini, menggunakan Refleksi untuk melakukan operasi pada suatu objek dapat menjadi pilihan terakhir. Saya harus menggunakan teknik ini lebih dari sekali.
sumber
Anda membatasi aksesibilitas lebih banyak lagi dengan naik satu tingkat lagi: lingkungan eksekusi.
Tidak semua bahasa memiliki konsep ini, tetapi setidaknya dengan Java Anda dapat menggunakan manajer keamanan yang melarang membuat bidang pribadi dapat diakses. Anda bisa menginstal manajer keamanan secara manual saat runtime, atau menambahkan kebijakan keamanan dalam file jar yang kemudian disegel untuk mencegah modifikasi.
Informasi lebih lanjut tentang melakukan ini di Jawa: Keamanan Refleksi
sumber
Refleksi apa yang Anda bicarakan?
Dalam banyak sistem refleksi, menghindari enkapsulasi adalah kemampuan eksplisit yang perlu diperoleh kode Anda, dan tidak memilikinya secara default.
Jika Anda khawatir tentang enkapsulasi, solusi sederhananya adalah dengan tidak menggunakan sistem refleksi yang tidak melestarikannya.
sumber
Dalam Python, tidak ada pengubah akses. Konvensi tersebut adalah awalan dengan menggarisbawahi metode dan variabel yang tidak diharapkan untuk diakses dari luar kelas. Apakah ini secara teknis mencegah Anda mengakses bidang tersebut dari kelas pihak ketiga? Tidak semuanya; tetapi jika Anda melakukannya, Anda sendirian dan mengambil risiko melanggar sesuatu, tanpa bisa menyalahkan kelas lain.
Di C #, pengubah akses ada, tetapi mereka hanya sebuah konvensi — yang dipaksakan oleh kompiler, tetapi masih sebuah konvensi. Ini berarti bahwa secara teknis, seseorang masih dapat mengakses dan mengubah variabel pribadi, baik melalui Refleksi atau dengan merusak memori secara langsung (seperti yang dilakukan pelatih game ). Konsekuensinya persis sama: jika variabel kelas Anda diubah melalui Refleksi dari kelas lain, atau melalui memori yang diubah oleh aplikasi lain, dan itu merusak sesuatu di kelas Anda, itu bukan kesalahan Anda.
Perhatikan bahwa ini, jelas, menciptakan masalah keamanan di mana pihak ketiga dapat mengakses data Anda ; sesuatu yang mengarah ke varian string dan struktur data serupa yang dienkripsi . Tetapi melindungi kode Anda dari penggunaan semacam itu lebih terkait dengan OS dan pembatasan akses tingkat kode , dan tidak ada hubungannya dengan Refleksi semata.
sumber