Ist es eine Sicherheitslücke, den Klassen- und Methodennamen zu protokollieren, wenn eine Ausnahme auftritt?

8

Ich habe folgendes:

public class doCheck(){

    public void performCheck(){
        try {
            perform all checks......
        }
        catch(Exception e){
            logger.error("Exception occured in class doCheck in method performCheck");
            thrown new MyNewException(e.getMessage());
        }
    }
}

Ist es sicher, den Klassen- und Methodennamen zu protokollieren?

blauer Himmel
quelle

Antworten:

8

Das hängt davon ab, ob Ihre Codebasis versteckt ist oder nicht. Wenn Sie das Produkt an den Client senden, kann er den Java-Bytecode ohnehin trivial überprüfen, sodass beim Protokollieren von Klassennamen keine Informationen angezeigt werden, die der Benutzer ohnehin nicht erhalten kann.

Für eine serverseitige Anwendung gilt dies weiterhin. Es kann jedoch eine Sicherheitslücke sein, solche Protokolle dem Client anzuzeigen. Aus diesem Grund unterscheiden die meisten Webanwendungs-Frameworks zwischen einer Entwicklungs- und einer Produktionskonfiguration: Während der Entwicklung werden dem Benutzer im Fehlerfall Debug-Informationen angezeigt. In der Produktion werden diese Informationen auf dem Server protokolliert, aber nicht mehr im Webbrowser / auf dem Client angezeigt.

Konrad Rudolph
quelle
Ja, und es ist wichtig sicherzustellen, dass die Protokolle selbst sicher sind - für externe Benutzer kann nicht zugegriffen werden und sie können absolut nicht geändert werden.
Donald.McLean
2
Zusammenfassend ist die Protokollierung der Klasse / Methode eine gute Sache. Es ist eine schlechte Sache, das Protokoll (oder eine Stapelverfolgung) entkommen zu lassen .
Qwerky
6

@Konrad beantwortete die direkte Frage, jedoch hat Ihre Ausnahmebehandlung ein kleines und zwei schwerwiegende Probleme. Da Sie ursprünglich auf codereview.SE gepostet haben, sind sie hier:

  1. Das Protokollieren einer Ausnahme vor dem Auslösen ist sinnlos. Protokollieren Sie es dort, wo Sie damit umgehen, und machen Sie sich nicht die Mühe, es zu fangen, wenn Sie nicht vorhaben, mit ti umzugehen.
  2. Wenn Sie eine Ausnahme protokollieren möchten, protokollieren Sie die Ausnahme. Sagen Sie nicht einfach "eine Ausnahme ist passiert" und erwarten Sie, dass die Leute erraten, was die Ausnahme ist. Alle gängigen Protokollierungsframeworks bieten eine Methode mit zwei Argumenten: Das erste ist die Nachricht, das zweite ist das Throwable.
  3. Das erneute Auslösen einer Ausnahme mit nur einer Nachricht ist das gleiche Problem, aber eine schlimmere Instanz. Ich kann (kaum) verstehen, warum Sie möglicherweise nicht möchten, dass ein Exception-Stack-Trace in Ihren Protokollen angezeigt wird. Aber sobald Sie die neue Ausnahme auslösen, haben Sie absolut keine Möglichkeit zu sagen, was das eigentliche Problem ist . Vor allem, wenn Sie die Gewohnheit behalten, zu fangen und neu zu werfen.

OK, ich werde ein viertes Problem hinzufügen: Sie protokollieren, wo die Ausnahme aufgetreten ist, aber Sie sagen nicht, was Sie getan haben, als es passiert ist, oder geben kontextbezogene Informationen an. Wenn Sie die tatsächliche Ausnahme protokollieren (Punkt 1), wissen Sie, wo sie aufgetreten ist. Wichtiger ist es, etwas wie "Datei foo.txt kann nicht geöffnet werden" zu sagen.

Parsifal
quelle
1

Es ist nicht besonders unsicher. Wenn Sie also nichts Kritisches in dieser Klasse verbergen möchten oder wenn die Klasse Teil eines kritischen Pfads ist (wie ein sicherer Handshake oder eine "versteckte" Funktion), würde ich dies nicht als Problem betrachten überhaupt.

Außerdem sprechen wir hier über Java. Wenn es sich also um eine clientseitige App handelt, auf der Java auf dem Client ausgeführt wird, können sie ihre JRE jederzeit so ändern, dass sie ihre eigenen Debugging-Routinen hinzufügen und / oder einen benutzerdefinierten Klassenladeprogramm verwenden und so ziemlich auf Ihre Klassen zugreifen, wie sie möchten. Es ist immer möglich, es ihnen schwerer zu machen (indem man Dinge tiefer versteckt oder sogar Code verschleiert), aber es ist normalerweise nicht kosteneffektiv, wenn man die Zeit und den Aufwand berücksichtigt, die erforderlich sind, um dies gegen den durch statistisch unwahrscheinliche Verlust verursachten Verlust zu erreichen böswillige Benutzer.

Wenn es sich um eine serverseitige Software handelt, die möglicherweise Protokolle an Clients (z. B. an den Browser des Benutzers) ausgibt, ist dies wahrscheinlich keine allzu große Sache, aber es ist bereits einfacher zu beheben: Konfigurieren Sie Ihren Container Verwenden Sie ein Protokollierungsframework oder einen Multiplexer, um stattdessen zu Debugging-Zwecken in die entsprechenden Dateien auf dem Server auszugeben. Auf diese Weise behalten Sie nützliche Datensätze für das Debuggen bei, ohne jedoch potenziell nützliche Informationen zu gefährden.

Aber im Allgemeinen wäre dies wahrscheinlich kein Problem. Es ist eher das, was Sie in die Debug-Nachricht einfügen, was ein Problem sein könnte, da wir als Entwickler häufig dazu neigen, Dinge auszugeben, an denen wir arbeiten (Sie möchten diese Debug-Ausgaben für Benutzernamen, Kennwörter, Salze und Sicherheitstoken nicht im Blick behalten ).

Haylem
quelle