private
Değiştirici sınıf dışındaki erişimi kısıtlamak için kullanılır, ancak yansıma diğer sınıfları kullanarak özel yöntem ve alanları erişebilir. Bu yüzden, gereksinimin bir parçasıysa erişilebilirliği nasıl kısıtlayabileceğimizi merak ediyorum.
private
Değiştirici sınıf dışındaki erişimi kısıtlamak için kullanılır, ancak yansıma diğer sınıfları kullanarak özel yöntem ve alanları erişebilir. Bu yüzden, gereksinimin bir parçasıysa erişilebilirliği nasıl kısıtlayabileceğimizi merak ediyorum.
Yanıtlar:
Erişim değiştiricilerin amacı, geliştiricileri bir sınıfın genel arabirimi hakkında kod yazma konusunda bilgilendirmektir. Hiçbir şekilde bir güvenlik önlemi değildirler ve herhangi bir bilgiyi tam anlamıyla gizlemez veya korumazlar.
Alıntı sınıf erişim haklarına ilişkin Herb Sutter :
"Buradaki sorun Murphy'ye karşı Machiavelli'ye karşı korumaya karşı korumaktır, yani kazara yanlış kullanıma (dilin çok iyi yaptığı) karşı korumak ve kasıtlı kötüye kullanıma karşı korumak (etkili bir şekilde imkansızdır). bir programcı sistemi yıkmak için yeterince kötü istiyor, bir yol bulacak "
#define private public
(aslında Tanımsız Davranış olduğunu görmezden gelirim) ve voila Sınıflarınızın kısıtlı kısmına dışarıdan tam erişimim var .
Hayır, bu aslında önemli bir avantaj. Bazı geliştiriciler kimsenin bir parça iç devlete erişmesi gerektiğini düşünmediğinden, hiçbir meşru kullanım durumunun ortaya çıkmayacağı anlamına gelmez. Bu durumlarda, bir nesne üzerinde ameliyat yapmak için Reflection kullanmak son çare olabilir. Bu tekniği bir kereden fazla kullanmak zorunda kaldım.
Bir seviye daha yükselterek erişilebilirliği daha da kısıtlarsınız: yürütme ortamı.
Tüm dillerde bu kavram yoktur, ancak en azından Java ile özel alanları erişilebilir hale getirmeyi yasaklayan bir güvenlik yöneticisi kullanabilirsiniz. Güvenlik yöneticisini çalışma zamanında el ile yükleyebilir veya bir jar dosyasına güvenlik değişikliği ekleyebilirsiniz.
Java ile bunu yapma hakkında daha fazla bilgi: Reflection Security
Hangi yansımadan bahsediyorsun?
Birçok yansıma sisteminde, kapsüllemeyi atlatmak, kodunuzun elde etmesi gereken ve varsayılan olarak sahip olmadığı açık bir özelliktir.
Kapsülleme konusunda endişeleriniz varsa, basit çözüm sadece onu korumayan bir yansıma sistemi kullanmamaktır.
Python'da erişim değiştiricileri yoktur. Kural, sınıfın dışından erişilmesi beklenmeyen yöntem ve değişkenlerin altını çizerek çizer. Bu tür bir alana üçüncü taraf bir sınıftan erişmenizi teknik olarak engelliyor mu? Bir şey değil; ama eğer yaparsanız, tek başınıza olursunuz ve diğer sınıfı suçlayamadan bir şeyi kırma riskini alırsınız.
C # 'da, erişim değiştiriciler mevcuttur, ancak bunlar sadece bir derlemedir - derleyici tarafından uygulanan bir sözleşmedir, ancak yine de bir sözleşmedir. Bu, teknik olarak, kişisel değişkenlere Ya Yansıma yoluyla ya da doğrudan belleğe müdahale ederek ( oyun eğitmenlerinin yaptığı gibi ) erişip değiştirebileceği anlamına gelir . Sonuç tamamen aynıdır: Sınıfınızın değişkenleri başka bir sınıftan Yansıma veya başka bir uygulamanın bellek kurcalamasıyla değiştirilirse ve sınıfınızdaki bir şeyi kırarsa, bu sizin hatanız değildir.
Bunun, üçüncü tarafların verilerinize erişebileceği açık bir şekilde güvenlik sorunları oluşturduğunu unutmayın ; bir dizenin şifreli varyantlarına ve benzer veri yapılarına yol açan bir şey . Ancak kodunuzu bu tür kullanımlardan korumak, daha fazla işletim sistemi ve kod düzeyinde erişim kısıtlamalarıdır ve kendi başına Yansıma ile ilgisi yoktur.