Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Reflektion ger möjlighet att få information om typer och medlemmar och att få åtkomst till medlemmar (det vill säga att anropa metoder och konstruktorer, hämta och ange egenskapsvärden, lägga till och ta bort händelsehanterare och så vidare). Användningen av reflektion för att få information om typer och medlemmar är inte begränsad. All kod kan använda reflektion för att utföra följande uppgifter:
- Räkna upp typer och medlemmar och granska deras metadata.
- Räkna upp och granska sammansättningar och moduler.
Att använda reflection för att få tillgång till medlemmar är däremot föremål för begränsningar. Från och med .NET Framework 4 kan endast betrodd kod använda reflektion för att komma åt säkerhetskritiska medlemmar. Dessutom kan endast betrodd kod använda reflektion för att få åtkomst till icke-offentliga medlemmar som inte skulle vara direkt tillgängliga för kompilerad kod. Slutligen måste kod som använder reflektion för att få åtkomst till en säker-kritisk medlem ha de behörigheter som den säker-kritiska medlemmen kräver, precis som med kompilerad kod.
Med nödvändiga behörigheter kan kod använda reflektion för att utföra följande typer av åtkomst:
Åtkomst till offentliga medlemmar som inte är säkerhetskritiska.
Få åtkomst till icke-offentliga medlemmar som skulle vara tillgängliga för kompilerad kod, om dessa medlemmar inte är säkerhetskritiska. Exempel på sådana icke-offentliga medlemmar är:
Skyddade medlemmar i den anropande kodens basklasser. (I eftertanke kallas detta för åtkomst på familjenivå.)
internalmedlemmar (Friendmedlemmar i Visual Basic) i anropskodens sammansättning. (I eftertanke kallas detta för åtkomst på sammansättningsnivå.)Privata medlemmar i andra instanser av klassen som innehåller den anropande koden.
Till exempel är kod som körs i en sandbox-programdomän begränsad till den åtkomst som beskrivs i den här listan, såvida inte programdomänen beviljar ytterligare behörigheter.
Från och med .NET Framework 2.0 Service Pack 1 genererar försök att komma åt medlemmar som normalt inte är tillgängliga en begäran om rättighetsuppsättningen för målobjektet plus ReflectionPermission med ReflectionPermissionFlag.MemberAccess-flaggan. Kod som körs med fullständigt förtroende (till exempel kod i ett program som startas från kommandoraden) kan alltid uppfylla dessa behörigheter. (Detta är föremål för begränsningar i åtkomsten till säkerhetskritiska medlemmar, enligt beskrivningen senare i den här artikeln.)
Valfritt, en sandboxad applikationsdomän kan bevilja ReflectionPermission med flaggan ReflectionPermissionFlag.MemberAccess enligt beskrivningen i avsnittet Åtkomst till medlemmar som normalt är otillgängliga, senare i den här artikeln.
Åtkomst till Security-Critical medlemmar
En medlem är säkerhetskritisk om den har SecurityCriticalAttribute, om den tillhör en typ som har SecurityCriticalAttribute, eller om den finns i en säkerhetskritisk sammansättning. Från och med .NET Framework 4 är reglerna för åtkomst till säkerhetskritiska medlemmar följande:
Transparent kod kan inte använda reflektion för åtkomst till säkerhetskritiska medlemmar, även om koden är helt betrodd. En MethodAccessException, FieldAccessException, eller TypeAccessException kastas.
Kod som körs med partiellt förtroende behandlas som transparent.
Dessa regler är desamma oavsett om en säkerhetskritisk medlem nås direkt av kompilerad kod eller nås med hjälp av reflektion.
Programkod som körs från kommandoraden körs med fullständigt förtroende. Så länge den inte är markerad som transparent kan den använda reflektion för att få åtkomst till säkerhetskritiska medlemmar. När samma kod körs med partiellt förtroende (till exempel i en sandbox-programdomän) avgör sammansättningens förtroendenivå om den kan komma åt säkerhetskritisk kod: Om sammansättningen har ett starkt namn och installeras i den globala sammansättningscachen är den en betrodd sammansättning och kan anropa säkerhetskritiska medlemmar. Om den inte är betrodd blir den transparent även om den inte har markerats som transparent och inte har åtkomst till säkerhetskritiska medlemmar.
Reflektion och transparens
Från och med .NET Framework 4 avgör den gemensamma språkkörningen transparensnivån för en typ eller medlem från flera faktorer, inklusive sammansättningens förtroendenivå och programdomänens förtroendenivå. Reflektion ger IsSecurityCriticalegenskaperna , IsSecuritySafeCriticaloch IsSecurityTransparent så att du kan identifiera transparensnivån för en typ. I följande tabell visas giltiga kombinationer av dessa egenskaper.
| Säkerhetsnivå | ÄrSäkerhetskritisk | IsSecuritySafeCritical | IsSecurityTransparent |
|---|---|---|---|
| Kritisk | true |
false |
false |
| Säkerhetskritisk | true |
true |
false |
| Genomskinlig | false |
false |
true |
Att använda dessa egenskaper är mycket enklare än att undersöka säkerhetsanteckningarna för en sammansättning och dess typer, kontrollera den aktuella förtroendenivån och försöka duplicera körningens regler. Till exempel kan samma typ vara säkerhetskritisk när den körs från kommandoraden eller säkerhetstransparent när den körs i en sandbox-programdomän.
Det finns liknande egenskaper för klasserna MethodBase, FieldInfo, TypeBuilder, MethodBuilderoch DynamicMethod . (För andra reflektions- och emit-abstraktioner tillämpas säkerhetsattribut på de associerade metoderna; till exempel, i fallet med egenskaper tillämpas de på egenskapsaccessorerna.)
Åtkomst till medlemmar som normalt är otillgängliga
Om du vill använda reflektion för att anropa medlemmar som är otillgängliga enligt tillgänglighetsreglerna för den vanliga språkkörningen, måste din kod beviljas en av två behörigheter.
Om du vill tillåta att kod anropar alla icke-offentliga medlemmar:Din kod måste beviljas ReflectionPermission med ReflectionPermissionFlag.MemberAccess flaggan.
Anmärkning
Som standard nekar säkerhetsprincipen den här behörigheten till kod som kommer från Internet. Den här behörigheten bör aldrig beviljas för kod som kommer från Internet.
Om du vill tillåta att kod anropar en icke-offentlig medlem, så länge beviljandeuppsättningen för den sammansättning som innehåller den anropade medlemmen är samma som, eller en delmängd av, beviljandeuppsättningen för den sammansättning som innehåller den anropande koden: Din kod måste beviljas ReflectionPermission med ReflectionPermissionFlag.RestrictedMemberAccess flaggan.
Anta till exempel att du beviljar en programdomän Internetbehörighet plus ReflectionPermission med ReflectionPermissionFlag.RestrictedMemberAccess flaggan och sedan kör ett Internetprogram med två sammansättningar, A och B.
Sammansättning A kan använda reflection för att få åtkomst till privata medlemmar i sammansättning B, eftersom behörighetsuppsättningen för sammansättning B inte innehåller några behörigheter som A inte har beviljats.
Samling A kan inte använda reflection för att få åtkomst till privata medlemmar i .NET Framework-samlingar, till exempel mscorlib.dll, eftersom mscorlib.dll är fullt betrodd och därför har behörigheter som inte har beviljats till samling A. En MemberAccessException genereras när kodåtkomstsäkerhet går igenom stacken under körning.
Serialisering
För serialisering erbjuder SecurityPermission med SecurityPermissionAttribute.SerializationFormatter-flaggan möjlighet att få och ställa in medlemmar av serialiserbara typer, oavsett åtkomstnivå. Med den här behörigheten kan kod identifiera och ändra den privata statusen för en instans. (Förutom att beviljas lämpliga behörigheter måste typen markeras som serialiserbar i metadata.)
Parametrar av typen MethodInfo
Undvik att skapa offentliga medlemmar som accepterar MethodInfo parametrar, särskilt för tillförlitlig kod. Sådana medlemmar kan vara mer sårbara för skadlig kod. Tänk dig till exempel en publik medlem i kod med hög tillförlitlighet som har en MethodInfo parameter. Anta att den offentliga medlemmen indirekt anropar Invoke metoden för den angivna parametern. Om den offentliga medlemmen inte utför nödvändiga behörighetskontroller kommer anropet Invoke till metoden alltid att lyckas, eftersom säkerhetssystemet fastställer att anroparen är mycket betrodd. Även om skadlig kod inte har behörighet att direkt anropa metoden kan den fortfarande göra det indirekt genom att anropa den offentliga medlemmen.
Versionsinformation
Från och med .NET Framework 4 kan transparent kod inte använda reflektion för åtkomst till säkerhetskritiska medlemmar.
Flaggan ReflectionPermissionFlag.RestrictedMemberAccess introduceras i .NET Framework 2.0 Service Pack 1. Tidigare versioner av .NET Framework kräver ReflectionPermissionFlag.MemberAccess flaggan för kod som använder reflektion för att få åtkomst till icke-offentliga medlemmar. Det här är en behörighet som aldrig bör beviljas till delvis betrodd kod.
Från och med .NET Framework 2.0 kräver reflektion för att få information om icke-offentliga typer och medlemmar inte några behörigheter. I tidigare versioner krävs ReflectionPermission med flaggan ReflectionPermissionFlag.TypeInformation.