Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yansıma, türler ve üyeler hakkında bilgi edinme ve üyelere erişme (yöntem ve oluşturucuları çağırma, özellik değerlerini alma ve ayarlama, olay işleyicileri ekleme ve kaldırma vb.) olanağı sağlar. Türler ve üyeler hakkında bilgi edinmek için yansımanın kullanımı sınırlı değildir. Tüm kod aşağıdaki görevleri gerçekleştirmek için yansımayı kullanabilir:
- Türleri ve üyeleri numaralandırıp meta verilerini inceleyin.
- Derlemeleri ve modülleri numaralandırıp inceleyin.
Üyelere erişmek için yansıma kullanımı, bunun aksine, kısıtlamalara tabidir. .NET Framework 4'le başlayarak, güvenlik açısından kritik üyelere erişmek için yansımayı yalnızca güvenilen kod kullanabilir. Ayrıca, yalnızca güvenilen kod, derlenmiş kod tarafından doğrudan erişilemeyen aleni olmayan üyelere erişmek için yansıma kullanabilir. Son olarak, güvenli kritik üyeye erişmek için yansıma kullanan kod, derlenmiş kodda olduğu gibi, güvenli-kritik üyenin istediği izinlere sahip olmalıdır.
Gerekli izinlere bağlı olarak kod, aşağıdaki erişim türlerini gerçekleştirmek için yansımayı kullanabilir:
Güvenlik açısından kritik olmayan halka açık üyelere erişim sağlayın.
Gizli üyelere, eğer güvenlik açısından kritik değillerse ve derlenmiş kodun erişebileceği durumdalarsa erişin. Bu tür nonpublic üyelerine örnek olarak şunlar verilebilir:
Çağrı kodunun temel sınıflarındaki korumalı üyeler. (Yansımada bu, aile düzeyinde erişim olarak adlandırılır.)
internalçağıran kodun derlemesindeki üyeler (FriendVisual Basic'teki çağıran kod derlemesindeki üyeler). (Yansımada bu, derleme düzeyi erişim olarak adlandırılır.)Çağıran kodu içeren sınıfın diğer örneklerinin özel üyeleri.
Örneğin, korumalı bir uygulama etki alanında çalıştırılan kod, uygulama etki alanı ek izinler vermediği sürece bu listede açıklanan erişimle sınırlıdır.
.NET Framework 2.0 Service Pack 1'den itibaren, normalde erişilemeyen üyelere erişim girişimi, hedef nesnenin izin kümesine ek olarak ReflectionPermission ve ReflectionPermissionFlag.MemberAccess bayrağını içeren bir talep oluşturur. Tam güven ile çalışan kod (örneğin, komut satırından başlatılan bir uygulamadaki kod) her zaman bu izinleri karşılayabilir. (Bu, bu makalenin ilerleyen bölümlerinde açıklandığı gibi güvenlik açısından kritik üyelere erişim sınırlamalarına tabidir.)
İsteğe bağlı olarak, korumalı uygulama etki alanı, bu makalenin ilerleyen kısımlarında ReflectionPermission bölümünde açıklandığı gibi, ReflectionPermissionFlag.MemberAccess bayrağı ile yetki verebilir.
Security-Critical Üyelerine Erişme
Bir üye, SecurityCriticalAttribute etiketine sahipse, SecurityCriticalAttribute etiketine sahip bir türe aitse veya güvenlik açısından kritik bir derlemedeyse, güvenlik açısından kritiktir. .NET Framework 4'le başlayarak, güvenlik açısından kritik üyelere erişim kuralları aşağıdaki gibidir:
Saydam kod, koda tam olarak güvenilse bile güvenlik açısından kritik üyelere erişmek için yansıma kullanamaz. Bir MethodAccessException, FieldAccessException veya TypeAccessException fırlatılır.
Kısmi güvenle çalışan kod saydam olarak değerlendirilir.
Bu kurallar, güvenlik açısından kritik bir üyeye derlenmiş kodla doğrudan erişildiğinde veya yansıma kullanılarak erişildiğinde aynıdır.
Komut satırından çalıştırılacak uygulama kodu tam güven ile çalışır. Saydam olarak işaretlenmediği sürece, güvenlik açısından kritik üyelere erişmek için yansımayı kullanabilir. Aynı kod kısmi güvenle (örneğin korumalı bir uygulama etki alanında) çalıştırıldığında derlemenin güven düzeyi, güvenlik açısından kritik koda erişip erişemeyeceğini belirler: Derlemenin güçlü bir adı varsa ve genel derleme önbelleğine yüklenmişse, güvenilir bir derlemedir ve güvenlik açısından kritik üyeleri çağırabilir. Güvenilir değilse, saydam olarak işaretlenmese bile saydam olur ve güvenlik açısından kritik üyelere erişemez.
Yansıma ve Saydamlık
.NET Framework 4'ten başlayarak ortak dil çalışma zamanı, derlemenin güven düzeyi ve uygulama etki alanının güven düzeyi gibi çeşitli faktörlerden bir türün veya üyenin saydamlık düzeyini belirler. Yansıma, bir türün IsSecurityCriticalsaydamlık düzeyini keşfetmenizi sağlayan , IsSecuritySafeCriticalve IsSecurityTransparent özelliklerini sağlar. Aşağıdaki tabloda bu özelliklerin geçerli birleşimleri gösterilmektedir.
| Güvenlik düzeyi | IsSecurityCritical | GüvenlikGüvenliKritikMi | IsSecurityTransparent |
|---|---|---|---|
| Çok Önemli | true |
false |
false |
| Güvenlik açısından kritik | true |
true |
false |
| Saydam | false |
false |
true |
Bu özelliklerin kullanılması, derlemenin ve türlerinin güvenlik ek açıklamalarını incelemek, geçerli güven düzeyini kontrol etmek ve çalışma zamanı kurallarını çoğaltmaya çalışmaktan çok daha basittir. Örneğin, aynı tür komut satırından çalıştırıldığında güvenlik açısından kritik, güvenlik kısıtlamalı bir uygulama etki alanında çalıştırıldığında ise güvenlik açısından saydam olabilir.
MethodBase, FieldInfo, TypeBuilder, MethodBuilder ve DynamicMethod sınıflarında benzer özellikler vardır. (Diğer yansıma ve yansıma oluşturma soyutlamaları için, güvenlik öznitelikleri ilgili yöntemlere uygulanır; örneğin, özellikler söz konusu olduğunda, bunlar özellik erişimcilerine uygulanır.)
Normalde erişilemeyen üyelere erişme
Ortak dil çalışma zamanının erişilebilirlik kurallarına göre erişilemeyen üyeleri çağırmak için yansıma kullanmak için kodunuz iki izinden birine verilmelidir:
Kodun herhangi bir özel olmayan üyeyi çağırmasına izin vermek için: Kodunuza ReflectionPermission izni ReflectionPermissionFlag.MemberAccess bayrağı ile verilmelidir.
Uyarı
Varsayılan olarak, güvenlik ilkesi İnternet'ten kaynaklanan koda yönelik bu izni reddeder. Bu izin, İnternet'ten kaynaklanan koda hiçbir zaman verilmemelidir.
Kodun gizli herhangi bir üyeyi çağırmasına izin vermek için, çağırılan üyeyi içeren derlemenin izin kümesi, çağırma kodunu içeren derlemenin izin kümesi ile aynı veya onun alt kümesi olduğu sürece, kodunuza ReflectionPermission bayrağı ile ReflectionPermissionFlag.RestrictedMemberAccess verilmelidir.
Örneğin, bir uygulama etki alanına İnternet izinleri ve ReflectionPermission bayrağı verirken ReflectionPermissionFlag.RestrictedMemberAccess bayrağını da eklerseniz, ardından A ve B olmak üzere iki bileşenle bir İnternet uygulaması çalıştırdığınızı varsayalım.
A derlemesi, B derlemesinin özel üyelerine erişmek için yansıtma tekniğini kullanabilir çünkü B derlemesinin izin kümesi, A'nın sahip olmadığı herhangi bir izni içermemektedir.
Assembly A, mscorlib.dll tam olarak güvenilir olduğundan ve bu nedenle A derlemesine verilmemiş izinlere sahip olduğundan, mscorlib.dll gibi .NET Framework derlemelerinin özel üyelerine erişmek için yansıma kullanamaz. Kod erişim güvenliği çalışma zamanında yığında yürüdüğünde bir MemberAccessException oluşturulur.
Seri -leştirme
Serileştirme için bayrağı SecurityPermission , SecurityPermissionAttribute.SerializationFormatter erişilebilirlik fark etmeksizin seri hale getirilebilir türlerin üyelerini alma ve ayarlama olanağı sağlar. Bu izin, kodun bir örneğin özel durumunu bulmasını ve değiştirmesini sağlar. (Uygun izinlerin verilmesine ek olarak, türün meta verilerde serileştirilebilir olarak işaretlenmesi gerekir.)
MethodInfo Türü parametreleri
Güvenilir kodlar için özellikle MethodInfo parametreleri alan genel üyeler yazmaktan kaçının. Bu tür üyeler kötü amaçlı kodlara karşı daha savunmasız olabilir. Örneğin, yüksek güvenilirlikli kodda bir MethodInfo parametresi alan bir açık üye düşünün. Ortak üyenin sağlanan parametrede Invoke yöntemini dolaylı olarak çağırdığını varsayalım. Ortak üye gereken izin denetimlerini yapmazsa, güvenlik sisteminin çağıranı son derece güvenilir kabul etmesinden dolayı Invoke yöntemine yapılan çağrı her zaman başarılı olur. Kötü amaçlı kodun yöntemini doğrudan çağırma izni olmasa bile, ortak üyeyi çağırarak bunu dolaylı olarak yapmaya devam edebilir.
Sürüm Bilgileri
.NET Framework 4'le başlayarak saydam kod, güvenlik açısından kritik üyelere erişmek için yansıma kullanamaz.
ReflectionPermissionFlag.RestrictedMemberAccess bayrağı .NET Framework 2.0 Service Pack 1'de tanıtılır. .NET Framework'ün önceki sürümleri, özel üyelere erişmek için yansıma kullanacak kodların ReflectionPermissionFlag.MemberAccess bayrağını gerektirir. Bu, kısmen güvenilen koda hiçbir zaman verilmemesi gereken bir izindir.
.NET Framework 2.0 ile başlayarak, özel erişime sahip olmayan türler ve üyeler hakkında bilgi edinmek için yansıtma kullanmak herhangi bir izne ihtiyaç duymaz. Önceki sürümlerde ReflectionPermission, ReflectionPermissionFlag.TypeInformation bayrağı ile birlikte gereklidir.