CA2112: Gesicherte Typen sollten keine Felder verfügbar machen.
TypeName |
SecuredTypesShouldNotExposeFields |
CheckId |
CA2112 |
Kategorie (Category) |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Ein öffentlicher oder geschützter Typ enthält öffentliche Felder und wird durch Verknüpfungsaufrufe gesichert.
Regelbeschreibung
Wenn Code auf eine Instanz eines Typs zugreifen muss, der durch einen Linkaufruf gesichert ist, muss der Code für den Zugriff auf die Felder des Typs nicht die Anforderungen des Linkaufrufs erfüllen.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Felder in nicht-öffentliche Felder um, und fügen Sie öffentliche Eigenschaften oder Methoden hinzu, die die Felddaten zurückgeben.LinkDemand-Sicherheitsüberprüfungen für Typen schützen den Zugriff auf die Eigenschaften und Methoden des Typs.Die Codezugriffssicherheit gilt jedoch nicht für Felder.
Wann sollten Warnungen unterdrückt werden?
Sowohl aufgrund der Sicherheitsaspekte und der Prinzipien für gute Entwürfe sollten Sie Verstöße beheben, indem Sie die öffentlichen Felder in nicht-öffentliche Felder umwandeln.Sie können eine Warnung dieser Regel unterdrücken, wenn das Feld keine Informationen enthält, die gesichert bleiben sollten und wenn Sie nicht auf den Inhalt des Felds angewiesen sind.
Beispiel
Das folgende Beispiel umfasst einen Bibliothekstyp (SecuredTypeWithFields) mit ungesicherten Feldern, einen Typ (Distributor), der Instanzen des Bibliothekstyps erstellen kann, und fälschlicherweise an Typen übergibt, die nicht berechtigt sind, die Instanzen zu erstellen, und Anwendungscode, der die Felder einer Instanz lesen kann, auch wenn er nicht über die Berechtigung verfügt, durch die der Typ gesichert wird.
Der folgende Bibliothekscode verstößt gegen die Regel.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
// This code requires immediate callers to have full trust.
[System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Name="FullTrust")]
public class SecuredTypeWithFields
{
// Even though the type is secured, these fields are not.
// Violates rule: SecuredTypesShouldNotExposeFields.
public double xValue;
public double yValue;
public SecuredTypeWithFields (double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine(
"Creating an instance of SecuredTypeWithFields.");
}
public override string ToString()
{
return String.Format (
"SecuredTypeWithFields {0} {1}", xValue, yValue);
}
}
}
Die Anwendung kann wegen des Linkaufrufs, der den gesicherten Typ schützt, keine Instanz erstellen.Die folgende Klasse gibt der Anwendung die Möglichkeit, eine Instanz des gesicherten Typs zu erhalten.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
// This assembly executes with full trust.
namespace SecurityRulesLibrary
{
// This type creates and returns instances of the secured type.
// The GetAnInstance method incorrectly gives the instance
// to a type that does not have the link demanded permission.
public class Distributor
{
static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
public static SecuredTypeWithFields GetAnInstance ()
{
return s;
}
public static void DisplayCachedObject ()
{
Console.WriteLine(
"Cached Object fields: {0}, {1}", s.xValue , s.yValue);
}
}
}
Die folgende Anwendung zeigt, wie Code ohne Zugriffsberechtigung für die Methoden eines gesicherten Typs auf dessen Felder zugreifen kann.
using System;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// This code executes with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name = "FullTrust")]
namespace TestSecurityExamples
{
public class TestLinkDemandOnField
{
[STAThread]
public static void Main()
{
// Get an instance of the protected object.
SecuredTypeWithFields secureType = Distributor.GetAnInstance();
// Even though this type does not have full trust,
// it can directly access the secured type's fields.
Console.WriteLine(
"Secured type fields: {0}, {1}",
secureType.xValue,
secureType.yValue);
Console.WriteLine("Changing secured type's field...");
secureType.xValue = 99;
// Distributor must call ToString on the secured object.
Distributor.DisplayCachedObject();
// If the following line is uncommented, a security
// exception is thrown at JIT-compilation time because
// of the link demand for full trust that protects
// SecuredTypeWithFields.ToString().
// Console.WriteLine("Secured type {0}",secureType.ToString());
}
}
}
Folgende Ergebnisse werden zurückgegeben:
Verwandte Regeln
CA1051: Sichtbare Instanzfelder nicht deklarieren