Yansımayla İlgili Güvenlik Konuları

Düşünceler ion, 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ıma kullanımı kısıtlanmaz. 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.

Bunun aksine, üyelere erişmek için yansıma kullanmak 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 için doğrudan erişilemeyen abone 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 genel üyelere erişin.

  • Bu üyeler güvenlik açısından kritik değilse derlenmiş kod tarafından erişilebilecek, abonelik dışı üyelere erişin. Bu tür nonpublic üyelerine örnek olarak şunlar verilebilir:

    • Çağıran kodun temel sınıflarının korumalı üyeleri. (Yansımada bu, aile düzeyinde erişim olarak adlandırılır.)

    • internal çağıran kodun derlemesindeki üyeler (Friend Visual Basic'teki ü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 başlayarak normalde erişilemeyen üyelere erişmeye çalışmak, hedef nesnenin ReflectionPermissionReflectionPermissionFlag.MemberAccess ve bayrağının izin kümesine yönelik 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 ReflectionPermissionFlag.MemberAccess devamında Normalde Erişilemeyen Üyelere Erişme bölümünde açıklandığı gibi bayrağını verebilirReflectionPermission.

Güvenlik Açısından Kritik Üyelere Erişme

Bir üye, sahip olduğu SecurityCriticalAttributebir türe SecurityCriticalAttributeaitse 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:

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.

Düşünceler 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. Düşünceler ion, 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 IsSecuritySafeCritical IsSecurityTransparent
Kritik true false false
Kasa 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 denetlemek ve çalışma zamanının 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 veya korumalı bir uygulama etki alanında çalıştırıldığında güvenlik açısından saydam olabilir.

, , FieldInfo, TypeBuilderMethodBuilderve DynamicMethod sınıflarında MethodBasebenzer özellikler vardır. (Diğer yansıma ve yansıma yayma soyutlamaları için, güvenlik öznitelikleri ilişkili yöntemlere uygulanır; örneğin, özellik erişimcilerine uygulanan özellikler söz konusu olduğunda.)

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 abonelik dışı üyeyi çağırmasına izin vermek için:Kodunuz bayrağıyla ReflectionPermissionFlag.MemberAccess verilmelidirReflectionPermission.

    Not

    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.

  • Çağırılan üyeyi içeren derlemenin izin kümesi çağırma kodunu içeren derlemenin izin kümesi ile aynı veya alt kümesi olduğu sürece kodun abonelik dışı herhangi bir üyeyi çağırmasına izin vermek için: Kodunuz bayrakla ReflectionPermissionFlag.RestrictedMemberAccess verilmelidirReflectionPermission.

Örneğin, bir uygulama etki alanına İnternet izinlerinin yanı sıra ReflectionPermission bayrağını ReflectionPermissionFlag.RestrictedMemberAccess ve ardından A ve B olmak üzere iki derlemeyle bir İnternet uygulaması çalıştırdığınızı varsayalım.

  • A derlemesi, B derlemesinin izin kümesi A'nın verilmediği izinleri içermediğinden, B derlemesinin özel üyelerine erişmek için yansımayı kullanabilir.

  • A Derlemesi, 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 MemberAccessException erişimi güvenliği, çalışma zamanında yığında yürüdüğünde oluşturulur.

Serileş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

Özellikle güvenilen kod için parametre alacak MethodInfo genel üyeler yazmaktan kaçının. Bu tür üyeler kötü amaçlı kodlara karşı daha savunmasız olabilir. Örneğin, bir parametre alan MethodInfo yüksek güvenilir kodda bir genel üye düşünün. Ortak üyenin sağlanan parametrede Invoke yöntemini dolaylı olarak çağırdığını varsayalım. Ortak üye gerekli izin denetimlerini gerçekleştirmezse, güvenlik sistemi çağıranın Invoke son derece güvenilir olduğunu belirlediğinden 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 Bilgisi

  • .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, aboneliği olmayan üyelere erişmek için yansıma kullanan kod için bayrağı gerektirir ReflectionPermissionFlag.MemberAccess . Bu, kısmen güvenilen koda hiçbir zaman verilmemesi gereken bir izindir.

  • .NET Framework 2.0'da başlayarak, abonelik dışı türler ve üyeler hakkında bilgi edinmek için yansıma kullanmak herhangi bir izin gerektirmez. Önceki sürümlerde ReflectionPermissionReflectionPermissionFlag.TypeInformation bayrağı gereklidir.

Ayrıca bkz.