6 Stimmen

Sollten Code Contracts für die Sicherheit verwendet werden?

Gibt es Gründe, warum Sie Code Contracts nicht zur Durchsetzung von Geschäftsregeln verwenden würden?

Stellen Sie sich vor, Sie haben eine User Klasse, die einen einzelnen Benutzer eines Systems repräsentiert und Aktionen definiert, die gegenüber anderen Benutzern durchgeführt werden können. Sie könnten eine ChangePassword Methode wie diese...

public void ChangePassword(User requestingUser, string newPassword)
{
    Contract.Requires<ArgumentNullException>(requestingUser);
    Contract.Requires<ArgumentNullException>(newPassword);

    // Users can always change their own password, but they must be an
    // administrator to change someone else's.
    if (requestingUser.UserId != this.UserId &&
        !requestingUser.IsInRole("Administrator"))
        throw new SecurityException("You don't have permission to do that.");

    // Change the password.
    ...
}

Oder Sie könnten die Sicherheitsprüfung als Vorbedingung implementieren mit Contract.Requires ...

public void ChangePassword(User requestingUser, string newPassword)
{
    Contract.Requires<ArgumentNullException>(requestingUser != null);
    Contract.Requires<ArgumentNullException>(newPassword != null);

    // Users can always change their own password, but they must be an
    // administrator to change someone else's.
    Contract.Requires<SecurityException>(
        requestingUser.UserId == this.UserId ||
        !requestingUser.IsInRole("Administrator"),
        "You don't have permission to do that.");

    // Change the password.
    ...
}

Was sind die Vor- und Nachteile dieser beiden Methoden?

2voto

porges Punkte 29409

Ich denke, die Antwort ist nein. Code Contracts sind für Szenarien konzipiert, in denen ihr Scheitern auf ein schwerwiegender Fehler im Code . Sie sollten no etwas sein, das wiederhergestellt werden kann, z. B. eine falsche Benutzereingabe.

Requires<T> sollte nur für öffentliche Methoden einer Bibliothek verwendet werden, die von anderen genutzt werden, die keine Code Contracts verwenden, oder wenn Sie Legacy-Code haben, der hinsichtlich der Ausnahmen, die er auslösen kann, kompatibel bleiben muss.

Für neuen Code sollten Sie nur Requires , nicht Requires<T> . Einfaches Requires löst standardmäßig eine unfangbare Ausnahme aus, um Sie zu zwingen, sich mit dem Problem zu befassen.

Und wenn jemand die Code Contracts-Laufzeitüberprüfung deaktiviert, verschwindet Ihre gesamte Sicherheit!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X