Özel değişkenler kısıtlanamadığı için yansıma bir dezavantaj mıdır?


14

privateDeğ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.


2
Düşük güven kodu özel yansımayı kullanamaz (en azından diğer meclislerde değil, ayrıntıları unuttum). Tam güven kodu, işlemdeki kısıtlamaları atlamak için yalnızca işaretçileri kullanabilir.
CodesInChaos

55
Özel erişim değiştiricileri, programcılara "bunu sınıfın dışından kullanmadığını ve gerçekten yaparsanız, bir sonraki sürümün kodunuzu ihlal edip etmediğinden şikayet etmeyin" i kesinlikle katı bir güvenlik özelliği olarak söylemek için vardır.
CodesInChaos


4
Kullanıcılar ayrıca istediklerini yapmak için kodunuzu ekleyebilir. DRM (kalıcı koruma sağlayacak kadar güçlü olmayan) için kısmi bir istisna dışında, uygulamanıza erişimi olan herkes (ikili dosyalar veya kaynak kodu) onunla her şeyi yapabilir.
Brian

6
Bu dile özgü bir soru değil mi? Yansıma farklı dillerde farklı çalışır. Bu sorunun Java veya başka bir şey için bir etiketi olup olmadığını merak ediyorum.
Wayne Conrad

Yanıtlar:


54

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.


33
Bu evrensel olarak doğru değil. Aktaran Eric Lippert , "CLR Erişim düzenleyiciler güvenlik özellikleridir. Erişim için kurallar iyice güvenlik ve tip güvenlik sistemleri conflated edilir." C #, Yansıma tam güven altında çalışan koduna kullanılabilir. Bu , kodu çalıştıran sistemin kötü niyetli kullanıcıları için geçerli değildir (ve uygulayamaz) . Ancak, kötü amaçlı eklentiler için geçerlidir.
Brian

5
@Brian Brian'ın bahsettiği sorunun nerede olduğu, bir sistemin üçüncü taraf kodunun tam olarak güvenmeden çalışmasına izin verdiği zamandır. Örnekler arasında tarayıcı kum kutuları (örn. Çok nefret edilen uygulama), google uygulama motoru ve Azure bulunur . Güvenilmeyen kodun platformun temel kitaplıklarının ayrıntılarını keşfetmesine izin vermek Azure için gerçekten aptalca olur.
JimmyJames

3
@Brian Bu% 100 doğru değil - kısmen güvenilen kodda yapabileceğiniz bazı yansıtma işlemleri var; özel alanlara erişme gibi şeyler yapmanıza izin vermez.
Luaan

1
@Brian Birisi kısıtlamaları aşmasına izin veren bir güvenlik açığı veya sosyal mühendislik bulana kadar. Onları bu şekilde kullanmaya çalışmanın bir anlamı yok. Bu onların birincil amacı değil.
jpmc26

31

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 "


2
Orada olan sen kum havuzu güvenilmeyen koduna gerek kere, ama bu yıldırıcı bir iştir. Hataya karşı korunma (Murphy) çok daha yaygın bir durumdur.
Paul Draper

#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 .
bolov

Kasıtlı istismara karşı koruma teorik olarak imkansız olabilir , ancak istismarın çok nadiren gerçekleşmesini yeterince zorlaştırarak etkili bir şekilde mümkündür. Bu konuda net olmak önemlidir. Aksi takdirde, yaşamı kritik tıbbi cihazlar gibi yazılımlar hiçbir şekilde kullanılamaz.
MarkJ

@MarkJ. Herb Sutter'in sözleri, sınıfı ilk başta yazan geliştiricinin ve belki de takım arkadaşlarının kasıtlı kötüye kullanımı ile ilgilidir. Dil özelliklerine göre bu tür bir kötüye kullanımı önlemenin bir yolu olduğunu sanmıyorum.
Nemanja Trifunovic

@bolov dublör dil bağımlı olduğunu düşünüyorum. C / C ++ ön işlemcileri muhtemelen bununla kurtulmanıza izin verirken, onlarsız herhangi bir şey muhtemelen "#define içinde ayrılmış kelimeleri kullanamaz" hatası verir.
Dan Firelight tarafından Fiddling

10

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.


1
Başka bir deyişle, eksik gereksinimler veya eksik uygulama nedeniyle, muhtemelen bozuk bir API'yi atlatmanın bir yoludur.
Monica

4

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


3

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.


3

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.


2
C # 'da, yalnızca tam olarak güvenilen kodun özel üyeleri yansıtabileceğini unutmayın. Doğrudan belleği işlemek için yazmak hala işe yarar, ancak yerel koddakinden daha zordur .
Luaan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.