CA2107: Zkontrolujte použití odepřít a pouze povolit
TypeName |
ReviewDenyAndPermitOnlyUsage |
CheckId |
CA2107 |
Kategorie |
Microsoft.Security |
Narušující změna |
Narušující |
Příčina
Metoda obsahuje bezpečnostní kontrolu, která určuje bezpečnostní akci PermitOnly nebo Deny.
Popis pravidla
Bezpečnostní akce Použití metody PermitOnly a CodeAccessPermission.Deny by měly být používány pouze uživateli s pokročilou znalostí zabezpečení rozhraní .NET Framework.Kód používající tyto bezpečnostní akce by měl být podroben revizi zabezpečení.
Akce Deny mění výchozí chování průchodu zásobníkem, ke kterému dochází jako odpověď na požadavek zabezpečení.Umožňuje zadávat oprávnění, která po dobu trvání metody zamítání nesmí být udělena bez ohledu na skutečná oprávnění volajících v zásobníku volání.Pokud průchod zásobníkem zjistí metodu zabezpečenou akcí Deny a je-li požadované oprávnění zahrnuto v zamítnutých oprávněních, průchod zásobníkem se nezdaří.Akce PermitOnly také mění výchozí chování procházení zásobníku.Umožňuje kódu zadat pouze ta oprávnění, která lze přidělit, bez ohledu na oprávnění volajících.Pokud procházení zásobníkem zjistí metodu zabezpečenou akcí PermitOnly a není-li požadované oprávnění zahrnuto v oprávněních určených akcí PermitOnly, průchod zásobníkem se nezdaří.
V kódu, který se na tyto akce spoléhá, by měla být důkladně vyhodnocena slabá místa zabezpečení kvůli jejich omezenému použití a jemnému chování.Berte v úvahu následující skutečnosti:
Požadavky Požadavky na odkaz nejsou akcemi Deny a PermitOnly ovlivněny.
Pokud se akce Deny nebo PermitOnly vyskytne ve stejném rámci zásobníku jako požadavek, který způsobí průchod zásobníkem, nemají bezpečnostní akce žádný účinek.
Hodnoty použité pro sestavení oprávnění založených na cestě mohou být obvykle zadány různými způsoby.Zamítnutí přístupu k jedné formě cesty nezamezuje přístupu ke všem formám.Například je-li sdílené umístění souborů \\Server\Share mapováno na síťovou jednotku X:, je pro odepření přístupu k souboru na daném umístění zapotřebí odepřít přístup k cestě \\Server\Share, X:\Soubor a všem ostatním cestám, kterými lze k souboru přistoupit.
Metoda CodeAccessPermission.Assert může ukončit průchod zásobníkem před dosažením akce Deny nebo PermitOnly.
Má-li akce Deny jakýkoliv účinek, jmenovitě má-li volající oprávnění blokované touto akcí, může volající přistoupit ke chráněnému prostředku přímo a akci Deny obejít.Obdobně pokud by volající neměl zamítnuté oprávnění, průchod zásobníkem se bez akce Deny nezdaří.
Jak vyřešit porušení
Jakékoliv použití těchto bezpečnostních akcí způsobí porušení.Chcete-li porušení opravit, nepoužívejte tyto bezpečnostní akce.
Kdy potlačit upozornění
Upozornění tohoto pravidla potlačte pouze po dokončení revize zabezpečení.
Příklad
Následující příklad ukazuje některá omezení akce Deny.
Následující knihovna obsahuje třídu, která má dvě metody - obě jsou identické krom požadavku na zabezpečení, který je chrání.
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: ");
}
}
}
Následující aplikace demonstruje účinky akce Deny na zabezpečené metody knihovny.
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);
}
}
}
}
Tento příklad vytvoří následující výstup.
Viz také
Referenční dokumentace
CodeAccessPermission.PermitOnly