Revisão Negar e permitir o uso apenas
TypeName |
ReviewDenyAndPermitOnlyUsage |
CheckId |
CA2107 |
Category (Categoria) |
Microsoft.segurança |
Quebrando alterar |
Quebrando |
Causa
Um método contém uma verificação de segurança que especifica a ação de segurança PermitOnly ou Deny.
Descrição da regra
The Usando o método PermitOnly e CodeAccessPermission.Deny ações de segurança devem ser usadas somente por aqueles que possuem um conhecimento avançado dos .NET Framework segurança. Código que usa essas ações de segurança deve passar por uma revisão de segurança.
Negar altera o comportamento padrão de pilha walk ocorre em resposta a uma demanda de segurança.Ele permite que você especifique as permissões que não devem ser concedidas durante o método está negando, independentemente das permissões de chamadores na pilha de chamadas real.Se a movimentação da pilha detecta um método protegido por Negar e se a permissão usados desse sistema operacional está incluída nas permissões negadas, a movimentação da pilha falha.PermitOnly também altera o comportamento padrão de pilha walk.Ele permite que o código especificar somente as permissões que podem ser concedidas, independentemente das permissões os chamadores.Se a stack walk detecta um método protegido por PermitOnly e se a permissão usados desse sistema operacional não está incluída nas permissões especificadas pelo PermitOnly, a movimentação da pilha falhará.
Código que depende dessas ações deve ser avaliado cuidadosamente as vulnerabilidades de segurança por causa de suas utilidade limitada e comportamento sutil.Considere o seguinte:
Demandas de link não são afetados por Deny ou PermitOnly.
Se Deny ou PermitOnly ocorrer no mesmo registro de ativação a demanda faz com que o exame da pilha, sistema autônomo ações de segurança não têm efeito.
Geralmente podem ser especificados valores que são usados para construir permissões baseadas no caminho de várias maneiras.Negar acesso a um formulário do caminho não negar acesso a todos os formulários.Por exemplo, se um \\servidor\share de compartilhamento de arquivo é mapeada para uma unidade de rede X:, para negar acesso a um arquivo no compartilhamento, você deve negar \\servidor\Share\File X:\File e cada caminho que acessa o arquivo.
An CodeAccessPermission.Assert pode terminar uma pilha walk antes Deny ou PermitOnly é alcançado.
Se um Negar tem qualquer efeito, ou seja, quando um chamador possui uma permissão bloqueada pelo negar, em seguida, o chamador pode acessar diretamente, o recurso protegido ignorando negar.Da mesma forma, se o chamador não tem a permissão negada, o exame da pilha falhará sem negar.
Como corrigir violações
Qualquer uso das seguintes ações de segurança fará com que uma violação.Para corrigir uma violação, não use essas ações de segurança.
Quando suprimir avisos
Elimina um aviso esta regra somente depois de concluir uma revisão de segurança.
Exemplo
O exemplo a seguir demonstra algumas limitações de negar.
A seguinte biblioteca contém uma classe com dois métodos são idênticos exceto para as solicitações de segurança protegendo-os.
using System.Security;
using System.Security.Permissions;
using System;
namespace SecurityRulesLibrary
{
public class SomeSecuredMethods
{
// Demand immediate caller has suitable permission
// before revealing sensitive data.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByLinkDemand()
{
Console.Write("LinkDemand: ");
}
[EnvironmentPermissionAttribute(SecurityAction.Demand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByDemand()
{
Console.Write("Demand: ");
}
}
}
O aplicativo a seguir demonstra os efeitos de negar nos métodos protegidos da biblioteca.
using System.Security;
using System.Security.Permissions;
using System;
using SecurityRulesLibrary;
namespace TestSecurityLibrary
{
// Violates rule: ReviewDenyAndPermitOnlyUsage.
public class TestPermitAndDeny
{
public static void TestAssertAndDeny()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Assert();
try
{
SomeSecuredMethods.MethodProtectedByDemand();
Console.WriteLine(
"Caller's Deny has no effect on Demand " +
"with the asserted permission.");
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect on LinkDemand " +
"with the asserted permission.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}", e);
}
}
public static void TestDenyAndLinkDemand()
{
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect with " +
"LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}",e);
}
}
public static void Main()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Deny();
//Test Deny and Assert interaction for LinkDemands and Demands.
TestAssertAndDeny();
//Test Deny's effects on code in different stack frame.
TestDenyAndLinkDemand();
//Test Deny's effect on code in same frame as deny.
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"This Deny has no effect with LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine("This Deny protected the library.{0}",e);
}
}
}
}
O exemplo produz a seguinte saída.
Demand: Caller's Deny has no effect on Demand with the asserted permission. LinkDemand: Caller's Deny has no effect on LinkDemand with the asserted permission. LinkDemand: Caller's Deny has no effect with LinkDemand-protected code. LinkDemand: This Deny has no effect with LinkDemand-protected code.
Consulte também
Conceitos
Substituindo verificações de segurança
Referência
CodeAccessPermission.PermitOnly