2012-03-27 9 views
6

Wir müssen eine Klasse vor statischen Methoden aus Sicherheitsgründen "schützen". Wir möchten nicht, dass Neuentwickler Vorschläge von Codierungswerkzeugen befolgen, um ein Mitglied statisch zu machen, da wir einen Konstruktor mit einem Passwort verwenden müssen, um den Zugriff auf diese Klasse zu kontrollieren.Soll eine Klasse in C# instanziiert werden?

Gibt es eine Möglichkeit, eine .NET-Klasse in C# zu schützen, damit sie keine statischen Member enthält?

Würde sich eine solche Funktion, falls nicht verfügbar, für eine zukünftige .NET-Version lohnen?

Vielen Dank.

+10

Dies scheint zu fragen, ob Ihre Tools für den Benutzer verantwortlich sind. Warum schulen Sie nicht einfach Ihre Entwickler darüber, wie Sie die API richtig nutzen? – rossipedia

+2

Ich würde gerne die Argumentation hören, um statische Methoden zu beseitigen. Kannst du bitte teilen? –

+10

Newbie Devs gegen Devs machen Konstruktoren mit Passwörtern zu Instanziierung/Vererbung zu beschränken? wow, und nicht seine nicht ein lohnendes Merkmal – meandmycode

Antwort

8

Sie könnten wahrscheinlich StyleCop verwenden, um eine benutzerdefinierte Regel zu erzwingen. Es müsste jedoch als Build-Aktion implementiert werden.

Alternativ können Sie FxCop verwenden, um die Binärdateien zu analysieren.

3

Sie können eine Überprüfung mithilfe der Reflektion zur Laufzeit ausführen, ansonsten gibt es keine Sprachfunktion, die statische Elemente verhindert.

Ich kann keine gute Verwendung für eine solche Funktion vorstellen. Dies ist ein Kommunikationsproblem und kein Problem der Implementierung.

In Ihrem Fall könnten Sie Ihre geschützte Funktionalität in eine abstrakte Basisklasse einfügen und eine Prüfung durchführen, um festzustellen, ob der Benutzer autorisiert ist, bevor eine geschützte Funktion ausgeführt wird.

+0

Das Hinzufügen eines statischen Konstruktors, der das Vorhandensein von statischen Methoden überprüft, ist einfach zu schreiben. – CodesInChaos

0

Ich würde denken, eine versiegelte Klasse würde ausreichen, obwohl statische Mitglieder in der ursprünglichen Klassendeklaration erlaubt sind. Ich denke, dass abgeleitete Klassen keine weiteren statischen Elemente zulassen würden.

9

Am einfachsten ist es, FxCop auf Ihrem Build-Server einzurichten und eine benutzerdefinierte FxCop-Regel zu schreiben, um nach statischen Elementen zu suchen.

This question enthält Details zum Schreiben einer benutzerdefinierten FxCop-Regel.


Alternativ kann, wie SimpleCoder wies darauf hin, können Sie StyleCop verwenden, um die Regel auf den Quellcode zu erzwingen.

This page beschreibt, wie StyleCop mit Msbuild eingerichtet wird.

0

Ich muss zugeben, ich habe noch nie von einem solchen Sicherheitskonzept gehört. Ich denke, es gibt einen guten Grund, warum ich nichts davon gehört habe - bist du sicher, dass es so beschützend ist, wie du es willst?

Da der Konstruktor ein Kennwort enthalten muss, versuchen Sie, sich vor Personen zu schützen, die Ihre Klasse verwenden. Aber diese Leute können Ihre Klasse dekompilieren und neu kompilieren, um die Passwort-Überprüfung zu entfernen - also wovor sind Sie geschützt?

29

Wir müssen einen Konstruktor mit einem Passwort verwenden, um den Zugriff auf diese Klasse zu steuern.

Das klingt wie eine monumental schlechte Idee, aber natürlich weiß ich nichts über das Sicherheitsproblem, das Sie versuchen zu lösen. Dies ist die weitaus interessantere Frage als Ihre Frage: Für welche Bedrohung möchten Sie sich schützen? Es gibt wahrscheinlich einen besseren Weg, es zu tun.

Gibt es eine Möglichkeit, eine .NET-Klasse in C# zu schützen, um zu verhindern, dass es statische Member hat?

Lassen Sie ältere Entwickler die Checkins von Junior-Entwicklern überprüfen. Was Sie sowieso tun sollten, aber insbesondere wenn die Klasse eine Art Sicherheits-Semantik hat.

Würde sich eine solche Funktion, falls nicht verfügbar, für eine zukünftige .NET-Version lohnen?

Das ist unwahrscheinlich im Extremfall.

Danke.

Sie sind willkommen!

+3

Stahlen die Gedanken direkt aus meinem Gehirn. – StriplingWarrior

+5

5 für 'Du bist willkommen' –

+2

@SimpleCoder: Meine Mutter hat mich gelehrt, dass, wenn jemand durch mich zu sagen. –

0

Vorschläge

  1. Ausbildung
  2. Weitere Trainings
  3. -Code Bewertungen
  4. Andere StyleCop oder FxCop vorgeschlagen - beide gute Möglichkeiten
  5. Wenn # 4 nicht - mehr Ausbildung - diesmal binden Sie es an Leistungsbeurteilungen. :)
0

Ich stimme so ziemlich mit Eric Lippert. Aber in solchen Fällen möchte ich so etwas machen (manchmal nur, um mich davon abzuhalten, Fehler zu machen). Ich versuche, einen Komponententest dafür zu schreiben. Gefällt mir:

[Test] 
public void Class_should_not_have_static_methods() 
{ 
    var staticMethods = typeof (Foo).GetMethods().Where(x => x.IsStatic); 

    Assert.That(staticMethods.Count(), Is.EqualTo(0), "Static methods: " + string.Join(", ", staticMethods.Select(x => x.Name))); 
} 
Verwandte Themen