CA2108: Zkontrolujte deklarativní zabezpečení na hodnotách
TypeName |
ReviewDeclarativeSecurityOnValueTypes |
CheckId |
CA2108 |
Kategorie |
Microsoft.Security |
Narušující změna |
Nenarušující |
Příčina
Typ veřejné nebo chráněné hodnoty jsou zabezpečena pomocí Data a modelování v rozhraní .NET Framework nebo Požadavky na odkaz.
Popis pravidla
Typy hodnot jsou přiděleny a před provést jiné konstruktory inicializovat pomocí jejich výchozí konstruktory.Typ hodnoty jsou zabezpečena pomocí poptávky nebo LinkDemand a volající nemá oprávnění, které splňují kontrola zabezpečení konstruktor libovolné jiné než výchozí nebude a bude vyvolána výjimka zabezpečení.Typ hodnoty není odebrána; To je ponecháno ve stavu, nastavit jeho výchozí konstruktor.Nepředpokládejte, že volající, který předává instance typu hodnoty oprávnění vytvořit nebo získat přístup k instanci.
Jak vyřešit porušení
Porušení tohoto pravidla nelze opravit, pokud odeberete z typu kontroly zabezpečení a použití metody zabezpečení na úrovni kontrol v místě.Všimněte si, že oprava poruší tímto způsobem nebrání tomu, aby volající dostatečná oprávnění v získání instance typu hodnoty.Musíte zajistit, že důvěrné údaje nebudou vystaveny instance typu hodnoty ve výchozím stavu a nelze jej použít škodlivým způsobem.
Kdy potlačit upozornění
Upozornění od tohoto pravidla můžete potlačit, pokud nějaký volající mohou získat instance typu hodnoty ve výchozím stavu aniž představují ohrožení zabezpečení.
Příklad
Následující příklad ukazuje knihovnou obsahující hodnotový typ, který porušuje tato pravidla.Všimněte si, že StructureManager typu se předpokládá, že volající, který předává instance typu hodnoty má oprávnění vytvořit nebo získat přístup k instanci.
using System;
using System.Security;
using System.Security.Permissions;
[assembly:AllowPartiallyTrustedCallers]
namespace SecurityRulesLibrary
{
// Violates rule: ReviewDeclarativeSecurityOnValueTypes.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public struct SecuredTypeStructure
{
internal double xValue;
internal double yValue;
public SecuredTypeStructure(double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine("Creating an instance of SecuredTypeStructure.");
}
public override string ToString()
{
return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
}
}
public class StructureManager
{
// This method asserts trust, incorrectly assuming that the caller must have
// permission because they passed in instance of the value type.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]
public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
{
aStructure.xValue += 100;
aStructure.yValue += 100;
Console.WriteLine ("New values {0}", aStructure.ToString());
return aStructure;
}
}
}
Následující aplikace ukazuje slabiny knihovně.
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name="FullTrust")]
namespace TestSecurityExamples
{
public class TestDemandOnValueType
{
static SecuredTypeStructure mystruct;
[STAThread]
public static void Main()
{
try
{
mystruct = new SecuredTypeStructure(10,10);
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure custom constructor: {0}", e.Message);
}
// The call to the default constructor
// does not throw an exception.
try
{
mystruct = StructureManager.AddStepValue(
new SecuredTypeStructure());
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure default constructor: {0}", e.Message);
}
try
{
StructureManager.AddStepValue(mystruct);
}
catch (Exception e)
{
Console.WriteLine(
"StructureManager add step: {0}", e.Message);
}
}
}
}
Tento příklad vytvoří následující výstup.