Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Program .NET Framework udostępnia trzy sposoby emitowania wspólnego języka pośredniego (CIL), z których każdy ma własne problemy z zabezpieczeniami:
- Zestawy dynamiczne
- Metody dynamiczne hostowane anonimowo
- Metody dynamiczne skojarzone z istniejącymi zestawami
Niezależnie od sposobu generowania kodu dynamicznego wykonywanie wygenerowanego kodu wymaga wszystkich uprawnień wymaganych przez typy i metody, których używa wygenerowany kod.
Uwaga / Notatka
Uprawnienia wymagane do refleksji kodu i generowania kodu uległy zmianie wraz z kolejnymi wersjami programu .NET Framework. Zobacz Informacje o wersji w dalszej części tego artykułu.
Zestawy dynamiczne
Zestawy dynamiczne są tworzone przy użyciu przeciążenia metody AppDomain.DefineDynamicAssembly. Większość przeciążeń tej metody jest przestarzała w programie .NET Framework 4 ze względu na eliminację zasad zabezpieczeń dla całej maszyny. Pozostałe przeciążenia mogą być wykonywane przez dowolny kod, niezależnie od poziomu zaufania. Te przeciążenia dzielą się na dwie grupy: te, które określają listę atrybutów, które mają być stosowane do zestawu dynamicznego podczas jego tworzenia, i tych, które nie. Jeśli nie określisz modelu przezroczystości dla zestawu, stosując SecurityRulesAttribute atrybut podczas jego tworzenia, model przezroczystości jest dziedziczony z emitowanego zestawu.
Uwaga / Notatka
Atrybuty stosowane do zestawu dynamicznego po jego utworzeniu przy użyciu SetCustomAttribute metody nie obowiązują, dopóki zestaw nie zostanie zapisany na dysku i ponownie załadowany do pamięci.
Kod w zestawie dynamicznym może uzyskiwać dostęp do widocznych typów i elementów członkowskich w innych zestawach.
Uwaga / Notatka
Zestawy dynamiczne nie używają flag ReflectionPermissionFlag.MemberAccess i ReflectionPermissionFlag.RestrictedMemberAccess, które umożliwiają dynamicznym metodom uzyskać dostęp do typów niepublicznych i członków.
Przejściowe zestawy dynamiczne są tworzone w pamięci i nigdy nie są zapisywane na dysku, dlatego nie wymagają uprawnień dostępu do plików. Zapisanie zestawu dynamicznego na dysku wymaga użycia FileIOPermission odpowiednich flag.
Generowanie zestawów dynamicznych na podstawie częściowo zaufanego kodu
Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować przejściowy zestaw dynamiczny i wykonać jego kod:
Zestaw dynamiczny używa tylko typów publicznych i elementów członkowskich innych zestawów.
Uprawnienia wymagane przez te typy i elementy członkowskie są uwzględniane w zestawie przyznania częściowo zaufanego zespołu.
Zestaw nie jest zapisywany na dysku.
Symbole debugowania nie są generowane. (
InternetiLocalIntranetzestawy uprawnień nie zawierają niezbędnych uprawnień).
Metody dynamiczne hostowane anonimowo
Metody dynamiczne hostowane anonimowo są tworzone przy użyciu dwóch DynamicMethod konstruktorów, które nie określają skojarzonego typu lub modułu, DynamicMethod(String, Type, Type[]) i DynamicMethod(String, Type, Type[], Boolean). Te konstruktory umieszczają metody dynamiczne w zestawie udostępnionym przez system, w pełni zaufanym, przezroczystym pod względem zabezpieczeń. Do używania tych konstruktorów ani do emitowania kodu dla metod dynamicznych nie są wymagane żadne uprawnienia.
Zamiast tego, po utworzeniu anonimowo hostowanej metody dynamicznej, stos wywołań zostaje przechwycony. Po utworzeniu metody wymagania dotyczące zabezpieczeń są wykonywane względem przechwyconego stosu wywołań.
Uwaga / Notatka
Koncepcyjnie wymagania są stawiane podczas budowy metody. Oznacza to, że żądania mogą być stawiane w momencie emisji każdej instrukcji CIL. W bieżącej implementacji wszystkie żądania są realizowane, gdy wywoływana jest metoda DynamicMethod.CreateDelegate lub gdy wywoływany jest kompilator just-in-time (JIT), jeśli metoda jest uruchamiana bez wywołania CreateDelegate.
Jeśli domena aplikacji na to zezwala, anonimowo hostowane dynamiczne metody mogą pominąć kontrole widoczności JIT, z zastrzeżeniem następującego ograniczenia: Typy niepubliczne i elementy członkowskie dostępne przez anonimowo hostowaną metodę dynamiczną muszą znajdować się w zespołach, których zestawy uprawnień są równe lub podzbiory zestawu uprawnień stosu emitującego wywołania. Ta ograniczona zdolność pomijania kontroli widoczności JIT jest aktywowana, jeśli domena aplikacji przyznaje ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess.
Jeśli metoda używa tylko typów publicznych i elementów członkowskich, żadne uprawnienia nie są wymagane podczas tworzenia.
Jeśli określisz, że kontrole widoczności JIT powinny zostać pominięte, żądanie realizowane podczas konstruowania metody zawiera ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess oraz zestaw zezwoleń zestawu, który zawiera niepubliczny element członkowski, do którego uzyskuje się dostęp.
Ze względu na to, że zakres uprawnień niepublicznego elementu członkowskiego jest brany pod uwagę, częściowo zaufany kod ReflectionPermissionFlag.RestrictedMemberAccess, nie może podnieść swoich uprawnień, wykonując niepubliczne elementy członkowskie zaufanych zestawów.
Wykonanie metody dynamicznej, podobnie jak dowolnego innego emitowanego kodu, wymaga wszystkich zezwoleń wymaganych przez metody, z których korzysta metoda dynamiczna.
Zestaw systemowy hostujący anonimowe metody dynamiczne korzysta z SecurityRuleSet.Level1 modelu przezroczystości, który jest modelem przezroczystości używanym w programie .NET Framework przed programem .NET Framework 4.
Aby uzyskać więcej informacji, zobacz klasę DynamicMethod .
Generowanie anonimowo hostowanych metod dynamicznych na podstawie częściowo zaufanego kodu
Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować anonimowo hostowaną metodę dynamiczną i wykonać ją:
Metoda dynamiczna używa tylko typów publicznych i składowych. Jeśli zestaw dotacji zawiera ReflectionPermissionFlag.RestrictedMemberAccess, może używać typów niepublicowych i członków dowolnego zespołu, którego zestaw dotacji jest równy albo będący podzbiorem zestawu emitującego zespołu.
Uprawnienia wymagane przez wszystkie typy i elementy członkowskie używane przez metodę dynamiczną są uwzględniane w zestawie zezwoleń częściowo zaufanego zestawienia.
Uwaga / Notatka
Metody dynamiczne nie obsługują symboli debugowania.
Metody dynamiczne skojarzone z istniejącymi kompilacjami
Aby skojarzyć metodę dynamiczną z typem lub modułem w istniejącym zestawie, użyj dowolnego DynamicMethod konstruktora, który określa skojarzony typ lub moduł. Uprawnienia wymagane do wywołania tych konstruktorów różnią się, ponieważ kojarzenie metody dynamicznej z istniejącym typem lub modułem zapewnia dostęp metody dynamicznej do typów niepublicznych i elementów członkowskich.
Metoda dynamiczna skojarzona z typem ma dostęp do wszystkich elementów członkowskich tego typu, nawet prywatnych elementów członkowskich oraz do wszystkich typów wewnętrznych i składowych w zestawie zawierającym skojarzony typ.
Metoda dynamiczna skojarzona z modułem ma dostęp do wszystkich
internaltypów i członków (Friendw Visual Basic,assemblyw metadanych środowiska uruchomieniowego języka wspólnego) w module.
Ponadto można użyć konstruktora, który określa możliwość pomijania kontroli widoczności kompilatora JIT. Dzięki temu metoda dynamiczna ma dostęp do wszystkich typów i członków we wszystkich assembly, niezależnie od poziomu dostępu.
Uprawnienia wymagane przez konstruktora zależą od tego, ile dostępu decydujesz się na nadanie metodzie dynamicznej:
Jeśli metoda używa tylko typów publicznych i elementów członkowskich i skojarzysz je z własnym typem lub własnym modułem, żadne uprawnienia nie są wymagane.
Jeśli określisz, że należy pominąć kontrole widoczności JIT, konstruktor z żąda ReflectionPermission z flagą ReflectionPermissionFlag.MemberAccess.
Jeśli skojarzysz metodę dynamiczną z innym typem, nawet typem w własnym zestawie, konstruktor wymaga flagi ReflectionPermission z ReflectionPermissionFlag.MemberAccess oraz flagi SecurityPermission z SecurityPermissionFlag.ControlEvidence.
Jeśli skojarzysz metodę dynamiczną z typem lub modułem w innym zestawie, konstruktor wymaga dwóch rzeczy: ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess oraz zestawu uprawnień zestawu, który zawiera inny moduł. Oznacza to, że stos wywołań musi zawierać wszystkie uprawnienia w zestawie uprawnień przydzielonych modułowi docelowemu, plus ReflectionPermissionFlag.RestrictedMemberAccess.
Uwaga / Notatka
W celu zapewnienia zgodności wstecznej, jeśli zapotrzebowanie na zestaw docelowych dotacji wraz z ReflectionPermissionFlag.RestrictedMemberAccess nie zostanie spełnione, konstruktor wymaga SecurityPermission z flagą SecurityPermissionFlag.ControlEvidence.
Chociaż elementy na tej liście są opisane pod względem uprawnień emitującego zestawu, należy pamiętać, że wymagania są wykonywane względem pełnego stosu wywołań, w tym granicą domeny aplikacyjnej.
Aby uzyskać więcej informacji, zobacz klasę DynamicMethod .
Generowanie metod dynamicznych na podstawie częściowo zaufanego kodu
Uwaga / Notatka
Zalecanym sposobem generowania metod dynamicznych z częściowo zaufanego kodu jest użycie metod dynamicznych hostowanych anonimowo.
Rozważ warunki, w których zestaw z uprawnieniami do Internetu może wygenerować metodę dynamiczną i wykonać ją:
Metoda dynamiczna jest albo skojarzona z modułem lub typem, który ją emituje, albo jej zestaw uprawnień zawiera ReflectionPermissionFlag.RestrictedMemberAccess i jest skojarzona z modułem w zestawie, którego zestaw uprawnień jest równy lub stanowi podzestaw zestawu uprawnień zespołu emitującego.
Metoda dynamiczna używa tylko typów publicznych i składowych. Jeśli jego zbiór zezwoleń zawiera ReflectionPermissionFlag.RestrictedMemberAccess i jest skojarzony z modułem w zestawie, którego zbiór zezwoleń jest równy lub stanowi podzbiór zbioru zezwoleń zestawu emitującego, może używać typów i członków oznaczonych
internal(Friendw Visual Basic,assemblyw metadanych środowiska uruchomieniowego języka wspólnego) w skojarzonym module.Uprawnienia wymagane przez wszystkie typy i członkowie używane przez metodę dynamiczną są uwzględniane w zestawie uprawnień częściowo zaufanego zespołu.
Metoda dynamiczna nie pomija kontroli widoczności JIT.
Uwaga / Notatka
Metody dynamiczne nie obsługują symboli debugowania.
Informacje o wersji
Począwszy od programu .NET Framework 4, zasady zabezpieczeń dla całej maszyny są usuwane, a przejrzystość zabezpieczeń staje się domyślnym mechanizmem wymuszania.
Począwszy od programu .NET Framework 2.0 z dodatkiem Service Pack 1, ReflectionPermission flaga ReflectionPermissionFlag.ReflectionEmit nie jest już wymagana podczas emitowania zestawów dynamicznych i metod dynamicznych. Ta flaga jest wymagana we wszystkich wcześniejszych wersjach programu .NET Framework.
Uwaga / Notatka
ReflectionPermission z flagą ReflectionPermissionFlag.ReflectionEmit jest domyślnie uwzględniana w zestawach uprawnień FullTrust i LocalIntranet, ale nie w zestawie uprawnień Internet. W związku z tym we wcześniejszych wersjach programu .NET Framework biblioteka może być używana z uprawnieniami do Internetu tylko wtedy, gdy wykonuje kod Assert dla ReflectionEmit programu. Takie biblioteki wymagają dokładnego przeglądu zabezpieczeń, ponieważ błędy kodowania mogą powodować luki w zabezpieczeniach. Program .NET Framework 2.0 z dodatkiem SP1 umożliwia emitowanie kodu w scenariuszach częściowego zaufania bez wystawiania żadnych wymagań dotyczących zabezpieczeń, ponieważ generowanie kodu nie jest z natury operacją uprzywilejowaną. Oznacza to, że wygenerowany kod nie ma więcej uprawnień niż zestaw, który go emituje. Dzięki temu biblioteki emitujące kod mogą być przezroczyste w zabezpieczeniach i eliminuje potrzebę potwierdzenia ReflectionEmit, co upraszcza zadanie pisania bezpiecznej biblioteki.
Ponadto dodatek SP1 dla programu .NET Framework 2.0 wprowadza flagę ReflectionPermissionFlag.RestrictedMemberAccess umożliwiającą dostęp do typów niepublicowych i elementów członkowskich z częściowo zaufanych metod dynamicznych. Wcześniejsze wersje programu .NET Framework wymagają użycia ReflectionPermissionFlag.MemberAccess flagi dla metod dynamicznych, które uzyskują dostęp do typów i elementów niepublicznych. Jest to uprawnienie, którego nigdy nie należy przyznawać częściowo zaufanemu kodowi.
Na koniec program .NET Framework 2.0 z dodatkiem SP1 wprowadza anonimowe metody hostowane.
Uzyskiwanie informacji o typach i członkach
Począwszy od .NET Framework 2.0, żadne uprawnienia nie są wymagane do uzyskania informacji o typach niepublicznych i elementach. Odbicie służy do uzyskiwania informacji potrzebnych do emitowania metod dynamicznych. Na przykład MethodInfo obiekty są używane do emitowania wywołań metod. Wcześniejsze wersje programu .NET Framework wymagają ReflectionPermission z flagą ReflectionPermissionFlag.TypeInformation. Aby uzyskać więcej informacji, zobacz Zagadnienia bezpieczeństwa dotyczące refleksji.