Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A .NET-keretrendszer három módszert kínál a közös köztes nyelv (CIL) kiadására, amelyek mindegyike saját biztonsági problémákkal rendelkezik:
- Dinamikus szerelvények
- Névtelenül üzemeltetett dinamikus metódusok
- Meglévő szerelvényekhez társított dinamikus metódusok
A dinamikus kód létrehozásának módjától függetlenül a generált kód végrehajtásához minden olyan engedély szükséges, amelyet a generált kód által használt típusok és módszerek igényelnek.
Megjegyzés:
A kódtükrözéshez és a kódkibocsátáshoz szükséges engedélyek a .NET-keretrendszer következő kiadásaival változtak meg. Lásd a cikk későbbi, verzióinformációi című szakaszát.
Dinamikus összeállítások
A dinamikus szerelvények a AppDomain.DefineDynamicAssembly metódus túlterheléseinek használatával jönnek létre. Ennek a módszernek a legtöbb túlterhelése elavult a .NET-keretrendszer 4-ben a gépszintű biztonsági szabályzat megszüntetése miatt. A fennmaradó túlterhelések bármely kóddal végrehajthatók, függetlenül a megbízhatósági szinttől. Ezek a túlterhelések két csoportba sorolhatók: azok, amelyek meghatározzák a dinamikus összeállításra alkalmazandó attribútumok listáját a létrehozásukkor, és azok, amelyek nem. Ha nem adja meg a szerelvény áttetszőségi modelljét, az SecurityRulesAttribute attribútum létrehozásakor az áttetszőségi modell öröklődik a kibocsátó szerelvénytől.
Megjegyzés:
A dinamikus szerelvényre a létrehozás után alkalmazott attribútumok a SetCustomAttribute metódus használatával csak akkor lépnek érvénybe, ha a szerelvényt lemezre menti, és újra betölti a memóriába.
A dinamikus szerelvény kódja hozzáférhet más szerelvények látható típusaihoz és tagjaihoz.
Megjegyzés:
A dinamikus szerelvények nem használják azokat a ReflectionPermissionFlag.MemberAccess jelzőket és ReflectionPermissionFlag.RestrictedMemberAccess jelzőket, amelyek lehetővé teszik, hogy a dinamikus metódusok hozzáférjenek a nem nyilvános típusokhoz és tagokhoz.
Az átmeneti dinamikus szerelvények a memóriában jönnek létre, és soha nem kerülnek lemezre, ezért nem igényelnek fájlhozzáférés-engedélyeket. A dinamikus szerelvény lemezre való mentéséhez szükséges a megfelelő jelölők használata FileIOPermission-val.
Dinamikus szerelvények létrehozása részben megbízható kódból
Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény átmeneti dinamikus szerelvényt hozhat létre, és végrehajthatja annak kódját:
A dinamikus összeállítás csak más összeállítások nyilvános típusait és tagjait használja.
Az ilyen típusok és tagok által igényelt engedélyek a részben megbízható assembly engedélyhalmazába tartoznak.
A szerelvény nincs mentve a lemezre.
A hibakeresési szimbólumok nem jönnek létre. (
InternetésLocalIntranetaz engedélykészletek nem tartalmazzák a szükséges engedélyeket.)
Névtelenül üzemeltetett dinamikus metódusok
A névtelenül üzemeltetett dinamikus metódusok a két DynamicMethod konstruktor használatával jönnek létre, amelyek nem adnak meg társított típust vagy modult, DynamicMethod(String, Type, Type[]) és DynamicMethod(String, Type, Type[], Boolean). Ezek a konstruktorok a dinamikus metódusokat egy rendszer által biztosított, teljes mértékben megbízható, biztonsági transzparens szerelvényben helyezik el. A konstruktorok használatához és a dinamikus metódusok kódjának kibocsátásához nincs szükség engedélyekre.
Ehelyett egy névtelenül üzemeltetett dinamikus metódus létrehozásakor a rendszer rögzíti a hívásvermet. A metódus létrehozásakor a rendszer biztonsági követelményeket támaszt a rögzített hívásveremen.
Megjegyzés:
Elméletileg a módszer felépítése során igények merülnek fel. Ez azt jelenti, hogy lehetnek igények az egyes CIL-utasítások kibocsátásakor. A jelenlegi implementációban minden követelmény teljesül, amikor a DynamicMethod.CreateDelegate metódust meghívják, vagy amikor az igény szerinti (JIT) fordító kerül meghívásra, amennyiben a metódust a CreateDelegate meghívása nélkül hívják meg.
Ha az alkalmazástartomány engedélyezi, a névtelenül üzemeltetett dinamikus metódusok kihagyhatják a JIT láthatósági ellenőrzését, a következő korlátozásra is figyelemmel: A névtelenül üzemeltetett dinamikus metódus által elért nem nyilvános típusok és tagok olyan szerelvényekben kell lenniük, amelyek támogatási készletei megegyeznek a kibocsátó hívásverem engedélyezési készletével vagy részhalmazával. Korlátozottan elérhető a JIT láthatósági ellenőrzések kihagyása, ha az alkalmazás-tartomány engedélyezi ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess jelzővel.
Ha a metódus csak nyilvános típusokat és tagokat használ, az építés során nincs szükség engedélyekre.
Ha azt határozza meg, hogy a JIT láthatósági ellenőrzését ki kell hagyni, a metódus létrehozásakor fennálló igény magában foglalja a ReflectionPermission elemet a ReflectionPermissionFlag.RestrictedMemberAccess jelzővel, valamint az engedélyezési készletet, amely tartalmazza a hozzáférés alatt álló nem nyilvános tagot tartalmazó szerelvényt.
Mivel figyelembe veszik a nem nyilvános tag engedélyezési halmazát, a részlegesen megbízhatónak ítélt ReflectionPermissionFlag.RestrictedMemberAccess kód, amely megkapta az engedélyt, nem növelheti jogosultságait a megbízható összeállítások nem nyilvános tagjainak futtatásával.
Mint minden más kibocsátott kód esetében, a dinamikus metódus végrehajtásához is szükség van a dinamikus metódus által használt metódusok által igényelt engedélyekre.
A névtelenül üzemeltetett dinamikus metódusokat futtató rendszerszerelvény az SecurityRuleSet.Level1 átláthatósági modellt használja, amely a .NET-keretrendszerben a .NET-keretrendszer 4. előtti átláthatósági modellje.
További információ: DynamicMethod osztály.
Névtelenül üzemeltetett dinamikus metódusok létrehozása részben megbízható kódból
Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény létrehozhat egy névtelenül üzemeltetett dinamikus metódust, és végrehajthatja azt:
A dinamikus módszer csak nyilvános típusokat és tagokat használ. Ha a támogatási csoport tartalmazza ReflectionPermissionFlag.RestrictedMemberAccess, akkor bármely olyan szerelvény nem nyilvános típusait és tagjait használhatja, amelyek támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével vagy annak egy részhalmazával.
A dinamikus módszer által használt összes típushoz és taghoz szükséges engedélyeket a részben megbízható szerelvény engedélyezési készlete tartalmazza.
Megjegyzés:
A dinamikus metódusok nem támogatják a hibakeresési szimbólumokat.
Meglévő szerelvényekhez társított dinamikus metódusok
Ha egy dinamikus metódust egy meglévő szerelvény egy típusához vagy modulhoz szeretne társítani, használja a DynamicMethod társított típust vagy modult meghatározó konstruktorokat. A konstruktorok meghívásához szükséges engedélyek eltérőek, mivel egy dinamikus metódus meglévő típussal vagy modullal való társítása hozzáférést biztosít a dinamikus metódusnak a nem nyilvános típusok és tagok számára:
Egy típushoz társított dinamikus metódus hozzáféréssel rendelkezik az adott típusú összes taghoz, még a privát tagokhoz is, valamint a társított típust tartalmazó szerelvény összes belső típusához és tagához.
A modulhoz társított dinamikus metódusok a modul összes
internaltípusához és tagjához hozzáférnek (Frienda Visual Basicben,assemblya közös nyelvi futtatókörnyezeti metaadatokban).
Emellett használhat egy olyan konstruktort is, amely lehetővé teszi a JIT-fordító láthatósági ellenőrzésének kihagyását. Ezzel a dinamikus metódus minden szerelvénytípushoz és taghoz hozzáférést biztosít a hozzáférési szinttől függetlenül.
A konstruktor által igényelt engedélyek attól függenek, hogy mennyi hozzáférést szeretne adni a dinamikus módszernek:
Ha a metódus csak nyilvános típusokat és tagokat használ, és a saját típusához vagy saját moduljához társítja, nincs szükség engedélyekre.
Ha megadja, hogy a JIT láthatósági ellenőrzéseket át kell ugrani, a konstruktor megköveteli a ReflectionPermission jelölőt a ReflectionPermissionFlag.MemberAccess-val.
Ha a dinamikus metódust egy másik típushoz társítja, még akkor is, ha ez a másik típus a saját összeállításában található, a konstruktor megköveteli a ReflectionPermission használatát a ReflectionPermissionFlag.MemberAccess jelzővel és a SecurityPermission használatát a SecurityPermissionFlag.ControlEvidence jelzővel.
Ha a dinamikus metódust egy másik szerelvény egy típusához vagy modulhoz társítja, a konstruktornak két dologra van szüksége: ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess jelölővel és a másik modult tartalmazó szerelvény engedélyezési készletével. Vagyis a hívásveremnek tartalmaznia kell a célmodul engedélyezési készletében lévő összes engedélyt, valamint ReflectionPermissionFlag.RestrictedMemberAccess.
Megjegyzés:
A visszamenőleges kompatibilitás érdekében, ha a cél hozzárendelési készlet igénye plusz ReflectionPermissionFlag.RestrictedMemberAccess nem teljesül, a konstruktor a SecurityPermission zászlóval követeli a SecurityPermissionFlag.ControlEvidence.
Bár a listában szereplő elemeket a kibocsátó szerelvény támogatási halmazában írják le, ne feledje, hogy a követelmények a teljes hívásveremhez kapcsolódnak, beleértve az alkalmazás tartományhatárát is.
További információ: DynamicMethod osztály.
Dinamikus metódusok létrehozása részben megbízható kódból
Megjegyzés:
A dinamikus metódusok részben megbízható kódból történő generálásának ajánlott módja a névtelenül üzemeltetett dinamikus metódusok használata.
Vegye figyelembe azokat a feltételeket, amelyek esetén egy internetes engedélyekkel rendelkező szerelvény dinamikus metódust hozhat létre és hajthat végre:
A dinamikus módszer vagy a kibocsátó modulhoz vagy típushoz van társítva, vagy a támogatási készlet tartalmazza ReflectionPermissionFlag.RestrictedMemberAccess , és egy olyan szerelvény egy moduljához van társítva, amelynek a támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével, vagy annak egy részhalmazával.
A dinamikus módszer csak nyilvános típusokat és tagokat használ. Ha a támogatási készlet tartalmazzaReflectionPermissionFlag.RestrictedMemberAccess, és egy olyan szerelvény egy moduljához van társítva, amelynek a támogatási készlete megegyezik a kibocsátó szerelvény támogatási készletével, használhatja a társított modulban (
internala Visual Basicben,Frienda közös nyelvi futtatókörnyezeti metaadatokban) megjelöltassemblytípusokat és tagokat.A dinamikus módszer által használt összes típus és tag által igényelt engedélyek a részben megbízható assembly engedélyezési halmazába beletartoznak.
A dinamikus módszer nem hagyja ki a JIT láthatósági ellenőrzését.
Megjegyzés:
A dinamikus metódusok nem támogatják a hibakeresési szimbólumokat.
Verzióadatok
A .NET-keretrendszer 4-től kezdve a gépszintű biztonsági szabályzat megszűnik, és a biztonsági átláthatóság lesz az alapértelmezett kényszerítési mechanizmus.
A .NET Framework 2.0 Service Pack 1 ReflectionPermission csomagtól kezdve a ReflectionPermissionFlag.ReflectionEmit jelölő már nem szükséges dinamikus szerelvények és dinamikus metódusok kibocsátásakor. Ez a jelző a .NET-keretrendszer összes korábbi verziójában kötelező.
Megjegyzés:
ReflectionPermissiona ReflectionPermissionFlag.ReflectionEmit jelölő alapértelmezés szerint szerepel az FullTrust és LocalIntranet elnevezett engedélykészletekben, de az Internet engedélykészletben nem. Ezért a .NET-keretrendszer korábbi verzióiban a kódtár csak akkor használható internetes engedélyekkel, ha végrehajtja Assert a következőt ReflectionEmit: . Az ilyen kódtárak gondos biztonsági felülvizsgálatot igényelnek, mert a kódolási hibák biztonsági réseket okozhatnak. A .NET Framework 2.0 SP1 lehetővé teszi a kód kiadását részleges megbízhatósági forgatókönyvekben anélkül, hogy biztonsági igényeket támasztanak, mivel a kód létrehozása nem eredendően kiemelt művelet. Vagyis a létrehozott kódnak nincs több engedélye, mint az azt kibocsátó szerelvénynek. Ez lehetővé teszi a kódokat kibocsátó könyvtárak számára, hogy biztonsági szempontból átláthatók legyenek, és feleslegessé teszik az ReflectionEmit igénylését, ami egyszerűsíti a biztonságos könyvtárak megírásának feladatát.
A .NET Framework 2.0 SP1 emellett bevezeti a ReflectionPermissionFlag.RestrictedMemberAccess nem nyilvános típusok és tagok részlegesen megbízható dinamikus metódusokból való elérésére szolgáló jelzőt. A .NET-keretrendszer korábbi verziói megkövetelik a ReflectionPermissionFlag.MemberAccess nem nyilvános típusokhoz és tagokhoz hozzáférő dinamikus metódusok jelölőjének használatát. Ez egy olyan engedély, amelyet soha nem szabad részlegesen megbízható kódhoz adni.
Végül a .NET Framework 2.0 SP1 névtelenül üzemeltetett metódusokat vezet be.
A típusok és tagok adatainak beszerzése
A .NET-keretrendszer 2.0-tól kezdve nincs szükség engedélyekre a nem nyilvános típusok és tagok adatainak beszerzéséhez. A reflexió a dinamikus metódusok kibocsátásához szükséges információk beszerzésére szolgál. Az objektumok például MethodInfo metódushívások kibocsátására szolgálnak. A .NET-keretrendszer korábbi verzióihoz a ReflectionPermissionReflectionPermissionFlag.TypeInformation jelölő szükséges. További információ: A tükröződés biztonsági szempontjai.