In SecurityTransparent-Code sollten keine Assertionen verwendet werden
Aktualisiert: November 2007
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2128 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Code, der als SecurityTransparentAttribute markiert wurde, verfügt nicht über ausreichende Berechtigungen für die Verwendung von Assertionen.
Regelbeschreibung
Durch diese Regel werden alle Methoden und Typen in einer Assembly analysiert, die entweder zu 100 % aus transparentem Code oder aus einer Kombination aus transparentem/relevantem Code besteht. Anschließend werden alle deklarativen oder imperativen Verwendungen von Assert gekennzeichnet.
Zur Laufzeit bewirken alle Aufrufe von Assert von transparentem Code aus, dass eine SecurityException ausgelöst wird. Dies kann sowohl bei 100 % transparenten als auch bei Assemblys mit kombiniertem transparentem/relevantem Code auftreten, in denen eine Methode oder ein Typ zwar transparent deklariert ist, jedoch eine deklarative oder imperative Assertion enthält.
In .NET Framework 2.0 wurde ein Feature mit dem Namen Transparenz eingeführt. Einzelne Methoden, Felder, Schnittstellen, Klassen und Typen können entweder sicherheitstransparent oder sicherheitsrelevant sein.
In transparentem Code können Sicherheitsberechtigungen nicht ausgeweitet werden. Daher werden alle durch Code gewährten oder angeforderten Berechtigungen automatisch durch den Code an den Aufrufer oder die Hostanwendungsdomäne weitergeleitet. Beispiele für Rechteerweiterungen sind Assertionen, LinkDemands, SuppressUnmanagedCode und unsafe-Code.
Behandlung von Verstößen
Um das Problem zu beheben, markieren Sie entweder den Code, durch den die Assertion aufgerufen wird, als SecurityCritical oder entfernen die Assertion.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Meldung dieser Regel.
Beispiel
Dieser Code verursacht einen Fehler, wenn SecurityTestClass transparent ist, während die Assert-Methode eine SecurityException auslöst.
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
// SecurityTransparent
void SecurityTransparentMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Eine Möglichkeit besteht darin, den [SecurityTransparentMethod]-Code zu überprüfen und, sofern [SecurityTransparentMethod] für die Rechteerweiterung als sicher betrachtet wird, [SecurityTransparentMethod] mit [SecurityCritical] zu markieren. Dazu ist es erforderlich, dass für [SecurityTransparentMethod] zusammen mit allen ausgehenden Aufrufen, die innerhalb von [SecurityTransparentMethod] stattfinden, unter der Assertion eine ausführliche, vollständige und fehlerfreie Sicherheitsüberprüfung durchgeführt werden muss:
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
[System.Security.SecurityCritical]
void SecurityCriticalMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Eine weitere Möglichkeit besteht darin, die Assertion aus dem Code zu entfernen und nachfolgende Datei-E/A-Berechtigungsanforderungen über [SecurityTransparentMethod] hinaus an den Aufrufer weiterleiten zu lassen, sodass Sicherheitsüberprüfungen vorgenommen werden können. In diesem Fall ist generell keine Sicherheitsüberprüfung erforderlich, da die Berechtigungsanforderungen zum Aufrufer und/oder zur Anwendungsdomäne geleitet werden. Berechtigungsforderungen unterliegen einer strengen Kontrolle durch Sicherheitsrichtlinien, die Hostumgebung und gewährte Berechtigungen für die Codequelle.