Yansıma Yaymadaki Güvenlik Sorunları

.NET Framework, her biri kendi güvenlik sorunlarıyla birlikte ortak ara dil (CIL) yaymak için üç yol sağlar:

Dinamik kod oluşturma yönteminize bakılmaksızın, oluşturulan kodun yürütülmesi, oluşturulan kodun kullandığı tür ve yöntemlerin gerektirdiği tüm izinleri gerektirir.

Not

Koda yansıtmak ve kod yayma için gereken izinler, .NET Framework'ün başarılı sürümleriyle değişti. Bu makalenin devamında yer alan Sürüm Bilgileri'ne bakın.

Dinamik Derlemeler

Dinamik derlemeler, yönteminin AppDomain.DefineDynamicAssembly aşırı yüklemeleri kullanılarak oluşturulur. Makine genelinde güvenlik ilkesinin ortadan kaldırılması nedeniyle bu yöntemin çoğu aşırı yüklemesi .NET Framework 4'te kullanım dışı bırakılmıştır. Kalan aşırı yüklemeler, güven düzeyinden bağımsız olarak herhangi bir kod tarafından yürütülebilir. Bu aşırı yüklemeler iki gruba ayrılır: dinamik derleme oluşturulduğunda uygulanacak özniteliklerin listesini belirtenler ve olmayanlar. Derleme için saydamlık modelini belirtmezseniz, özniteliği oluşturduğunuzda uygulayarak SecurityRulesAttribute saydamlık modeli yayan derlemeden devralınır.

Not

Oluşturulduktan sonra dinamik derlemeye uyguladığınız öznitelikler, yöntemini kullanarak SetCustomAttribute derleme diske kaydedilene ve belleğe yeniden yüklenene kadar etkili olmaz.

Dinamik derlemedeki kod, diğer derlemelerdeki görünür türlere ve üyelere erişebilir.

Not

Dinamik derlemeler, dinamik yöntemlerin ReflectionPermissionFlag.MemberAccess nonpublic türlerine ve üyelerine erişmesine izin veren ve ReflectionPermissionFlag.RestrictedMemberAccess bayraklarını kullanmaz.

Geçici dinamik derlemeler bellekte oluşturulur ve diske hiçbir zaman kaydedilmez, bu nedenle dosya erişim izinleri gerekmez. Dinamik derlemenin diske kaydedilmesi için uygun bayraklar gerekir FileIOPermission .

Kısmen Güvenilen Koddan Dinamik Derlemeler Oluşturma

İnternet izinlerine sahip bir derlemenin geçici bir dinamik derleme oluşturabileceği ve kodunu yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik derleme yalnızca ortak türleri ve diğer derlemelerin üyelerini kullanır.

  • Bu türler ve üyeler tarafından istenen izinler, kısmen güvenilen derlemenin izin kümesine dahil edilir.

  • Derleme diske kaydedilmez.

  • Hata ayıklama simgeleri oluşturulmaz. (Internet ve LocalIntranet izin kümeleri gerekli izinleri içermez.)

Anonim Olarak Barındırılan Dinamik Yöntemler

Anonim olarak barındırılan dinamik yöntemler, DynamicMethod(String, Type, Type[])DynamicMethod(String, Type, Type[], Boolean)ilişkili bir tür veya modül belirtmeyen ve iki DynamicMethod oluşturucu kullanılarak oluşturulur. Bu oluşturucular, dinamik yöntemleri sistem tarafından sağlanan, tam olarak güvenilen, güvenlik saydam bir derlemeye yerleştirir. Bu oluşturucuları kullanmak veya dinamik yöntemler için kod yaymak için izin gerekmez.

Bunun yerine, anonim olarak barındırılan bir dinamik yöntem oluşturulduğunda çağrı yığını yakalanır. Yöntemi oluşturulduğunda, yakalanan çağrı yığınına karşı güvenlik talepleri yapılır.

Not

Kavramsal olarak, yöntemin yapımı sırasında talepler yapılır. Yani, her CIL yönergesi yayıldıkça talepler ortaya çıkabilir. Geçerli uygulamada, yöntemi çağrıldığında DynamicMethod.CreateDelegate veya tam zamanında (JIT) derleyici çağrıldığında, yöntemi çağrılmadan CreateDelegateçağrılırsa tüm talepler yapılır.

Uygulama etki alanı izin verirse, anonim olarak barındırılan dinamik yöntemler şu kısıtlamaya tabi olarak JIT görünürlük denetimlerini atlayabilir: Anonim olarak barındırılan bir dinamik yöntem tarafından erişilen nonpublic türleri ve üyeleri, veren çağrı yığınının izin kümesine eşit veya alt kümeleri olan derlemelerde olmalıdır. Uygulama etki alanı bayrağını ReflectionPermissionFlag.RestrictedMemberAccess verirse JIT görünürlük denetimlerini atlamayı kısıtlanan ReflectionPermission bu özellik etkinleştirilir.

  • Yönteminiz yalnızca genel türleri ve üyeleri kullanıyorsa, oluşturma sırasında izin gerekmez.

  • JIT görünürlük denetimlerinin atlanması gerektiğini belirtirseniz, yöntem oluşturulduğunda yapılan talep bayrağını ReflectionPermissionFlag.RestrictedMemberAccess ve erişilmekte olan nonpublic üyesini içeren derlemenin izin kümesini içerirReflectionPermission.

Abonelik dışı üyenin izin kümesi dikkate alındığından, verilmiş ReflectionPermissionFlag.RestrictedMemberAccess olan kısmen güvenilen kod, güvenilen derlemelerin abonelik dışı üyelerini yürüterek ayrıcalıklarını yükseltemez.

Diğer tüm kodlarda olduğu gibi, dinamik yöntemin yürütülmesi için de dinamik yöntemin kullandığı yöntemler tarafından istenen izinler gerekir.

Anonim olarak barındırılan dinamik yöntemleri barındıran sistem derlemesi, .NET Framework 4'ün öncesinde .NET Framework'te kullanılan saydamlık modeli olan saydamlık modelini kullanır SecurityRuleSet.Level1 .

Daha fazla bilgi için sınıfına DynamicMethod bakın.

Kısmen Güvenilen Koddan Anonim Olarak Barındırılan Dinamik Yöntemler Oluşturma

İnternet izinlerine sahip bir derlemenin anonim olarak barındırılan bir dinamik yöntem oluşturabileceği ve yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik yöntem yalnızca genel türleri ve üyeleri kullanır. Verme kümesi içeriyorsa ReflectionPermissionFlag.RestrictedMemberAccess, atama kümesine eşit olan herhangi bir derlemenin veya yayan derlemenin izin kümesinin bir alt kümesi olan, abonelik dışı türleri ve üyelerini kullanabilir.

  • Dinamik yöntem tarafından kullanılan tüm türlerin ve üyelerin gerektirdiği izinler, kısmen güvenilen derlemenin izin kümesine eklenir.

Not

Dinamik yöntemler hata ayıklama simgelerini desteklemez.

Mevcut Derlemelerle İlişkili Dinamik Yöntemler

Dinamik bir yöntemi mevcut bir derlemedeki bir tür veya modülle ilişkilendirmek için, ilişkili türü veya modülü belirten oluşturuculardan herhangi birini DynamicMethod kullanın. Bu oluşturucuları çağırmak için gereken izinler farklılık gösterir, çünkü dinamik bir yöntemi mevcut bir tür veya modülle ilişkilendirmek, dinamik yönteme abonelik dışı türlere ve üyelere erişim verir:

  • Bir türle ilişkilendirilmiş dinamik bir yöntem, bu türün tüm üyelerine, hatta özel üyelere ve ilişkili türü içeren derlemedeki tüm iç türlere ve üyelere erişebilir.

  • Bir modülle ilişkili dinamik yöntem, modüldeki internal tüm tür ve üyelere (Friend Visual Basic'te, assembly ortak dil çalışma zamanı meta verilerinde) erişebilir.

Ayrıca, JIT derleyicisinin görünürlük denetimlerini atlamayı belirten bir oluşturucu kullanabilirsiniz. Bunu yaptığınızda, erişim düzeyinden bağımsız olarak dinamik yönteminiz tüm derlemelerdeki tüm türlere ve üyelere erişim sağlar.

Oluşturucu tarafından istenen izinler, dinamik yönteminize ne kadar erişim vermeye karar verdiğinize bağlıdır:

Bu listedeki öğeler, yayan derlemenin izin kümesi açısından açıklanmış olsa da, uygulama etki alanı sınırı da dahil olmak üzere taleplerin tam çağrı yığınına karşı yapıldığını unutmayın.

Daha fazla bilgi için sınıfına DynamicMethod bakın.

Kısmen Güvenilen Koddan Dinamik Yöntemler Oluşturma

Not

Kısmen güvenilen koddan dinamik yöntemler oluşturmanın önerilen yolu Anonim Olarak Barındırılan Dinamik Yöntemleri kullanmaktır.

İnternet izinlerine sahip bir derlemenin dinamik bir yöntem oluşturabileceği ve yürütebileceği koşulları göz önünde bulundurun:

  • Dinamik yöntem, onu yayan modül veya türle ilişkilendirilir ya da izin kümesi içerir ReflectionPermissionFlag.RestrictedMemberAccess ve bir derlemedeki izin kümesine eşit olan bir modülle veya yayan derlemenin bir alt kümesiyle ilişkilendirilir.

  • Dinamik yöntem yalnızca genel türleri ve üyeleri kullanır. Verme kümesi, verme kümesine eşit olan veya bir alt kümesi olan bir derlemedeki bir modül içeriyorsaReflectionPermissionFlag.RestrictedMemberAccess, ilişkili modülde (FriendVisual Basic'te, assembly ortak dil çalışma zamanı meta verilerinde) işaretlenmiş internal türleri ve üyeleri kullanabilir.

  • Dinamik yöntem tarafından kullanılan tüm türler ve üyeler tarafından istenen izinler, kısmen güvenilen derlemenin izin kümesine eklenir.

  • Dinamik yöntem JIT görünürlük denetimlerini atlamıyor.

Not

Dinamik yöntemler hata ayıklama simgelerini desteklemez.

Sürüm Bilgisi

.NET Framework 4'den başlayarak makine genelinde güvenlik ilkesi ortadan kalkar ve güvenlik şeffaflığı varsayılan zorlama mekanizması haline gelir.

.NET Framework 2.0 Service Pack 1'den ReflectionPermissionFlag.ReflectionEmit başlayarak dinamik ReflectionPermission derlemeler ve dinamik yöntemler yayarken bayrağı artık gerekli değildir. Bu bayrak, .NET Framework'ün önceki tüm sürümlerinde gereklidir.

Not

ReflectionPermissionbayrağı varsayılan ReflectionPermissionFlag.ReflectionEmit olarak ve LocalIntranet adlandırılmış izin kümelerine FullTrust dahil edilir, ancak izin kümesine Internet eklenmez. Bu nedenle, .NET Framework'ün önceki sürümlerinde, bir kitaplık yalnızca için ReflectionEmityürütürse Assert İnternet izinleri ile kullanılabilir. Kodlama hataları güvenlik açıklarına neden olabileceği için bu tür kitaplıklar dikkatli bir güvenlik incelemesi gerektirir. .NET Framework 2.0 SP1, kod oluşturma işlemi doğası gereği ayrıcalıklı bir işlem olmadığından, kısmi güven senaryolarında herhangi bir güvenlik talebi göndermeden kodun dağıtılmasına olanak tanır. Başka bir ifadeyle, oluşturulan kodun onu yayan derlemeden daha fazla izni yoktur. Bu, kod yayan kitaplıkların güvenliği saydam olmasını sağlar ve güvenli bir kitaplık yazma görevini basitleştiren onaylama ReflectionEmitgereksinimini ortadan kaldırır.

Buna ek olarak, .NET Framework 2.0 SP1 kısmen güvenilen dinamik yöntemlerden nonpublic türlerine ve üyelerine erişme bayrağını tanıtır ReflectionPermissionFlag.RestrictedMemberAccess . .NET Framework'ün önceki sürümleri, abonelik dışı türlere ve üyelere erişen dinamik yöntemler için bayrağı gerektirir ReflectionPermissionFlag.MemberAccess ; bu, kısmen güvenilen koda hiçbir zaman verilmemesi gereken bir izindir.

Son olarak, .NET Framework 2.0 SP1 anonim olarak barındırılan yöntemleri tanıtır.

Türler ve Üyeler Hakkında Bilgi Alma

.NET Framework 2.0'dan başlayarak, abonelik dışı türler ve üyeler hakkında bilgi almak için hiçbir izin gerekmez. Düşünceler ion, dinamik yöntemler yaymak için gereken bilgileri almak için kullanılır. Örneğin, MethodInfo nesneler yöntem çağrılarını yaymak için kullanılır. .NET Framework'ün önceki sürümleri için bayrağı gerekir ReflectionPermissionReflectionPermissionFlag.TypeInformation . Daha fazla bilgi için bkz. Düşünceler ion için Güvenlik Konuları.

Ayrıca bkz.