CA2108 : Vérifiez la sécurité déclarative dans les types valeur
Élément | Valeur |
---|---|
ID de la règle | CA2108 |
Category | Microsoft.Security |
Modification avec rupture | Sans rupture |
Cause
Un type valeur public ou protégé est sécurisé par des données et une modélisation ou des demandes de liaison.
Notes
Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.
Description de la règle
Les types valeur sont alloués et initialisés par leurs constructeurs par défaut avant l’exécution d’autres constructeurs. Si un type valeur est sécurisé par une demande ou une demande de liaison et que l’appelant ne dispose pas des autorisations qui satisfont à la vérification de sécurité, tout constructeur autre que la valeur par défaut échoue et une exception de sécurité est levée. Le type de valeur n’est pas libéré ; il reste à l’état défini par son constructeur par défaut. Ne partez pas du principe qu’un appelant qui passe une instance du type valeur est autorisé à créer l’instance ou à y accéder.
Comment corriger les violations
Vous ne pouvez pas corriger une violation de cette règle, sauf si vous supprimez la vérification de sécurité du type et utilisez des vérifications de sécurité au niveau de la méthode à la place. La correction de la violation de cette manière n’empêche pas les appelants disposant d’autorisations insuffisantes d’obtenir des instances du type valeur. Vous devez vous veiller à ce qu’aucune instance du type valeur, dans son état par défaut, n’expose des informations sensibles et ne puisse être utilisée de manière nuisible.
Quand supprimer les avertissements
Vous pouvez supprimer un avertissement de cette règle si un appelant peut obtenir des instances du type valeur dans son état par défaut sans représenter une menace pour la sécurité.
Exemple 1
L’exemple suivant montre une bibliothèque contenant un type valeur qui enfreint cette règle. Le type StructureManager
part du principe qu’un appelant qui passe une instance du type valeur est autorisé à créer l’instance ou à y accéder.
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;
}
}
}
Exemple 2
L’application suivante illustre la faiblesse de la bibliothèque.
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);
}
}
}
}
Cet exemple produit la sortie suivante :
Structure custom constructor: Request failed.
New values SecuredTypeStructure 100 100
New values SecuredTypeStructure 200 200
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour