Considerações sobre segurança relacionadas à reflexãoSecurity Considerations for Reflection

A reflexão fornece a capacidade de obter informações sobre tipos e membros e de acessar membros (ou seja, chamar métodos e construtores, obter e definir valores de propriedade, adicionar e remover manipuladores de eventos e assim por diante).Reflection provides the ability to obtain information about types and members, and to access members (that is, to call methods and constructors, to get and set property values, to add and remove event handlers, and so on). O uso da reflexão para obter informações sobre tipos e membros não é restrito.The use of reflection to obtain information about types and members is not restricted. Todo o código pode usar reflexões para realizar as seguintes tarefas:All code can use reflection to perform the following tasks:

  • Enumere os tipos e membros, e examine seus metadados.Enumerate types and members, and examine their metadata.

  • Enumerar e examine os módulos e assemblies.Enumerate and examine assemblies and modules.

Usar reflexão para acessar membros está, por outro lado, sujeitos a restrições.Using reflection to access members, by contrast, is subject to restrictions. A partir do .NET Framework 4, somente código confiável pode usar reflexão para acessar membros críticos para segurança.Beginning with the .NET Framework 4, only trusted code can use reflection to access security-critical members. Além disso, somente o confiável pode usar reflexão para acessar membros não públicos que não estariam diretamente acessíveis em código compilado.Furthermore, only trusted code can use reflection to access nonpublic members that would not be directly accessible to compiled code. Por fim, o código que usa reflexão para acessar um membro crítico para segurança deve ter as devidas permissões exigidas pelo membro crítico para segurança, assim como com código compilado.Finally, code that uses reflection to access a safe-critical member must have whatever permissions the safe-critical member demands, just as with compiled code.

O código pode usar reflexão para realizar os seguintes tipos de acesso, sujeito às permissões necessárias:Subject to necessary permissions, code can use reflection to perform the following kinds of access:

  • Acesse os membros públicos que não são críticos para segurança.Access public members that are not security-critical.

  • Acessar membros não públicos que estariam acessíveis ao código compilado, se tais membros não fossem críticos para segurança.Access nonpublic members that would be accessible to compiled code, if those members are not security-critical. Exemplos de tais membros não públicos:Examples of such nonpublic members include:

    • Membros protegidos de classes base do código de chamada.Protected members of the calling code's base classes. (Na reflexão, isso é chamado de acesso de nível familiar.)(In reflection, this is referred to as family-level access.)

    • Membros internal (membros Friend no Visual Basic) no assembly do código de chamada.internal members (Friend members in Visual Basic) in the calling code's assembly. (Na reflexão, isso é chamado de acesso no nível do assembly.)(In reflection, this is referred to as assembly-level access.)

    • Membros privados de outras instâncias da classe que contém o código de chamada.Private members of other instances of the class that contains the calling code.

Por exemplo, o código que é executado em um domínio do aplicativo em área restrita é limitado ao acesso descrito nesta lista, a menos que o domínio do aplicativo conceda permissões adicionais.For example, code that is run in a sandboxed application domain is limited to the access described in this list, unless the application domain grants additional permissions.

A partir do .NET Framework 2.0 Service Pack 1, tentar acessar membros que normalmente não podem ser acessados gera uma demanda para o conjunto de concessões do objeto de destino mais ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess.Starting with the .NET Framework 2.0 Service Pack 1, attempting to access members that are normally inaccessible generates a demand for the grant set of the target object plus ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag. Código que está sendo executado com confiança total (por exemplo, o código em um aplicativo que é iniciado da linha de comando) sempre pode atender a essas permissões.Code that is running with full trust (for example, code in an application that is launched from the command line) can always satisfy these permissions. (Isso é sujeito às limitações de acesso a membros de críticos para segurança, conforme descrito mais adiante neste artigo.)(This is subject to limitations in accessing security-critical members, as described later in this article.)

Como opção, um domínio do aplicativo em área restrita pode conceder ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess, conforme descrito na seção Acessando membros que são normalmente inacessíveis, mais adiante neste artigo.Optionally, a sandboxed application domain can grant ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag, as described in the section Accessing Members That Are Normally Inaccessible, later in this article.

Acessando membros críticos para segurançaAccessing Security-Critical Members

Um membro é crítico para segurança se ele tiver o SecurityCriticalAttribute, se ele pertencer a um tipo que tem o SecurityCriticalAttribute ou se ele está em um assembly crítico para segurança.A member is security-critical if it has the SecurityCriticalAttribute, if it belongs to a type that has the SecurityCriticalAttribute, or if it is in a security-critical assembly. A partir do .NET Framework 4, as regras para acessar membros críticos para segurança são as seguintes:Beginning with the .NET Framework 4, the rules for accessing security-critical members are as follows:

Essas regras são as mesmas se um membro crítico para segurança for acessado diretamente pelo código compilado ou por meio de reflexão.These rules are the same whether a security-critical member is accessed directly by compiled code, or accessed by using reflection.

Código de aplicativo que é executado da linha de comando é executado com confiança total.Application code that is run from the command line runs with full trust. Desde que não esteja marcado como transparente, ele pode usar reflexão para acessar membros críticos para segurança.As long as it is not marked as transparent, it can use reflection to access security-critical members. Quando o mesmo código é executado com confiança parcial (por exemplo, em um domínio do aplicativo em área restrita), o nível de confiança do assembly determina se ele pode acessar o código crítico para segurança: Se o assembly tem um nome forte e está instalado no cache de assembly global, ele é um assembly confiável e pode chamar membros críticos para segurança.When the same code is run with partial trust (for example, in a sandboxed application domain) the assembly's trust level determines whether it can access security-critical code: If the assembly has a strong name and is installed in the global assembly cache, it is a trusted assembly and can call security-critical members. Se não for confiável, ele se tornará transparente mesmo se não for marcado como transparente e não poderá acessar membros críticos para segurança.If it is not trusted, it becomes transparent even though it was not marked as transparent, and it cannot access security-critical members.

Para obter mais informações sobre o modelo de segurança no .NET Framework 4, consulte Alterações de Segurança.For more information about the security model in the .NET Framework 4, see Security Changes.

Reflexão e transparênciaReflection and Transparency

Do .NET Framework 4 em diante, o Common Language Runtime determina o nível de transparência de um tipo ou membro de vários fatores, incluindo o nível de confiança do assembly e o nível de confiança do domínio do aplicativo.Beginning with the .NET Framework 4, the common language runtime determines the transparency level of a type or member from several factors, including the trust level of the assembly and the trust level of the application domain. A reflexão fornece as propriedades IsSecurityCritical, IsSecuritySafeCritical e IsSecurityTransparent para que você possa descobrir o nível de transparência de um tipo.Reflection provides the IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent properties to enable you to discover the transparency level of a type. A tabela a seguir mostra as combinações válidas dessas propriedades.The following table shows the valid combinations of these properties.

Nível de segurançaSecurity level IsSecurityCriticalIsSecurityCritical IsSecuritySafeCriticalIsSecuritySafeCritical IsSecurityTransparentIsSecurityTransparent
CríticoCritical true false false
Crítico para segurançaSafe-critical true true false
TransparenteTransparent false false true

Usar essas propriedade é muito mais simples que examinar as anotações de segurança de um assembly e seus tipos, verificando o nível de confiança atual e tentando duplicar as regras do tempo de execução.Using these properties is much simpler than examining the security annotations of an assembly and its types, checking the current trust level, and attempting to duplicate the runtime's rules. Por exemplo, o mesmo tipo pode ser crítico para segurança quando é executado da linha de comando ou transparente de segurança quando é executado em um domínio do aplicativo em área restrita.For example, the same type can be security-critical when it is run from the command line, or security-transparent when it is run in a sandboxed application domain.

Há propriedades semelhantes nas classes MethodBase, FieldInfo, TypeBuilder, MethodBuilder e DynamicMethod.There are similar properties on the MethodBase, FieldInfo, TypeBuilder, MethodBuilder, and DynamicMethod classes. (Para outras reflexão e abstrações de emissão de reflexão, os atributos de segurança são aplicados aos métodos associados; por exemplo, no caso de propriedades que são aplicadas aos acessadores de propriedade).(For other reflection and reflection emit abstractions, security attributes are applied to the associated methods; for example, in the case of properties they are applied to the property accessors.)

Acessando membros que são normalmente inacessíveisAccessing Members That Are Normally Inaccessible

Para usar a reflexão para invocar os membros que podem ser acessados de acordo com as regras de acessibilidade do Common Language Runtime, o código deve receber uma das duas permissões:To use reflection to invoke members that are inaccessible according to the accessibility rules of the common language runtime, your code must be granted one of two permissions:

  • Para permitir que o código invoque qualquer membro não público: seu código deve receber a concessão de ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess.To allow code to invoke any nonpublic member:Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag.

    Observação

    Por padrão, a política de segurança nega essa permissão para código originado da Internet.By default, security policy denies this permission to code that originates from the Internet. Essa permissão nunca deve ser concedida o código originado da Internet.This permission should never be granted to code that originates from the Internet.

  • Para permitir que o código invoque qualquer membro não público, desde que o conjunto de concessões do assembly que contém o membro invocado seja o mesmo ou um subconjunto do conjunto de concessões do assembly que contém o código de invocação: O código precisa receber ReflectionPermission com o sinalizador ReflectionPermissionFlag.RestrictedMemberAccess.To allow code to invoke any nonpublic member, as long as the grant set of the assembly that contains the invoked member is the same as, or a subset of, the grant set of the assembly that contains the invoking code: Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

Por exemplo, suponha que você concedeu permissões da Internet a um domínio do aplicativo mais ReflectionPermission com o sinalizador ReflectionPermissionFlag.RestrictedMemberAccess e, em seguida, executou um aplicativo da Internet com dois assemblies, A e B.For example, suppose you grant an application domain Internet permissions plus ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag, and then run an Internet application with two assemblies, A and B.

  • O assembly A pode usar reflexão para acessar membros particulares do assembly B, pois o conjunto de concessões do assembly B não inclui permissões que não foram concedidas a A.Assembly A can use reflection to access private members of assembly B, because the grant set of assembly B does not include any permissions that A has not been granted.

  • O assembly A não pode usar a reflexão para acessar membros particulares de assemblies do .NET Framework como mscorlib.dll, pois mscorlib.dll é totalmente confiável e, portanto, tem permissões que não foram concedidas ao assembly A. Um MemberAccessException é gerado quando a segurança de acesso do código percorre a pilha no tempo de execução.Assembly A cannot use reflection to access private members of .NET Framework assemblies such as mscorlib.dll, because mscorlib.dll is fully trusted and therefore has permissions that have not been granted to assembly A. A MemberAccessException is thrown when code access security walks the stack at run time.

SerializaçãoSerialization

Para serialização, SecurityPermission com o sinalizador SecurityPermissionAttribute.SerializationFormatter fornece a capacidade de obter e definir os membros de tipos serializáveis, independentemente da acessibilidade.For serialization, SecurityPermission with the SecurityPermissionAttribute.SerializationFormatter flag provides the ability to get and set members of serializable types, regardless of accessibility. Essa permissão permite que o código descubra e altere o estado particular de uma instância.This permission enables code to discover and change the private state of an instance. (Além de receber a concessão das permissões apropriadas, o tipo deve ser marcado como serializável nos metadados.)(In addition to being granted the appropriate permissions, the type must be marked as serializable in metadata.)

Parâmetros do tipo MethodInfoParameters of Type MethodInfo

Evite escrever membros públicos que utilizam parâmetros MethodInfo, especialmente para código confiável.Avoid writing public members that take MethodInfo parameters, especially for trusted code. Esses membros podem ser mais vulneráveis a códigos mal-intencionados.Such members might be more vulnerable to malicious code. Por exemplo, considere um membro público no código altamente confiável que utiliza um parâmetro MethodInfo.For example, consider a public member in highly trusted code that takes a MethodInfo parameter. Suponha que o membro público chama indiretamente o método Invoke no parâmetro fornecido.Assume that the public member indirectly calls the Invoke method on the supplied parameter. Se o membro público não executa as verificações de permissão necessária, a chamada para o método Invoke sempre terá êxito, pois o sistema de segurança determina se o chamador é altamente confiável.If the public member does not perform the necessary permission checks, the call to the Invoke method will always succeed, because the security system determines that the caller is highly trusted. Mesmo que o código mal-intencionado não tenha permissão para invocar o método indiretamente, ele ainda poderá fazer isso indiretamente chamando o membro público.Even if malicious code does not have the permission to directly invoke the method, it can still do so indirectly by calling the public member.

Informações de versãoVersion Information

  • A partir do .NET Framework 4, código transparente não pode usar reflexão para acessar membros críticos para segurança.Beginning with the .NET Framework 4, transparent code cannot use reflection to access security-critical members.

  • O sinalizador ReflectionPermissionFlag.RestrictedMemberAccess foi introduzido no .NET Framework 2.0 Service Pack 1.The ReflectionPermissionFlag.RestrictedMemberAccess flag is introduced in the .NET Framework 2.0 Service Pack 1. Versões anteriores do .NET Framework exigem o sinalizador ReflectionPermissionFlag.MemberAccess para o código que usa a reflexão para acessar membros não públicos.Earlier versions of the .NET Framework require the ReflectionPermissionFlag.MemberAccess flag for code that uses reflection to access nonpublic members. Esta é uma permissão que nunca deve ser concedida a código parcialmente confiável.This is a permission that should never be granted to partially trusted code.

  • A partir do .NET Framework 2.0, usar reflexão para obter informações sobre tipos e membros não públicos não requer permissões.Beginning with the .NET Framework 2.0, using reflection to obtain information about nonpublic types and members does not require any permissions. Em versões anteriores, o ReflectionPermission com o sinalizador ReflectionPermissionFlag.TypeInformation é obrigatório.In earlier versions, ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag is required.

Consulte tambémSee also