22 Stimmen

Verbessert das Java-Schlüsselwort "final" tatsächlich die Sicherheit?

Es gibt zwar viele Gründe für die Verwendung des Schlüsselworts 'final' in Java Eine der Aussagen, die ich immer wieder höre, ist, dass der Code dadurch sicherer wird. Das scheint in diesem trivialen Fall zwar sinnvoll zu sein:

public class Password
{
    public final String passwordHash;
    ...
}

Mit dem letzten Schlüsselwort würde man erwarten, dass kein bösartiger Code in der Lage ist, die Variable passwordHash zu ändern. Allerdings, durch Reflexion ist es möglich, den endgültigen Modifikator für das Feld passwordHash zu ändern.

Bietet "final" also wirklich Sicherheit oder ist es nur ein Placebo?

Editar: Es gibt eine wirklich interessante Diskussion, und ich wünschte, ich könnte mehr als eine Antwort akzeptieren. Vielen Dank an alle für ihre Beiträge.

0 Stimmen

Hier ist eine Verbindung das mehrere (von Oracle geschriebene) Beispiele enthält, die zeigen, wie die endgültig Schlüsselwort kann für Sicherheitszwecke verwendet werden.

1voto

Steven Schlansker Punkte 35955

Das Schlüsselwort "final" hat in der Tat einige Sicherheitsaspekte. Stellen Sie sich vor, Sie entwerfen ein sicheres System mit einem Dienst, der bei Vorliegen einer Zeichenkette nur dann etwas tut, wenn die Zeichenkette gültig ist. Sie könnten schreiben:

public void doSomethingUseful(String argument) {
    checkValidity(argument);
    /* prepare to do something useful... preparation takes a bit of time! */
    reallyDoTheUsefulTask(argument);
}

Wäre String nicht final, könnte ein cleverer Angreifer String als Unterklasse anlegen. Ihre Zeichenkette ist nicht unveränderlich wie die Standardklasse String - und in der Tat können sie einen anderen Thread starten und versuchen, Ihre Methode anzugreifen, indem sie das Argument nach checkValidity, aber vor der eigentlichen Verwendung des Arguments ändern. Dann macht Ihre "nützliche Aufgabe" plötzlich etwas völlig Falsches und gefährdet möglicherweise die Sicherheit. Sie haben gerade Ihre Prüfungen umgangen! Da java.lang.String jedoch final ist, haben Sie gute Garantien, dass es sich bei einem String-Parameter tatsächlich um den unveränderlichen Standard-String handelt. Das ist eine ziemlich große Sache - es gab eine ganze Klasse von Kernel-Mode-Angriffen, die auf unsachgemäßer Parameterbehandlung mit Syscalls basierten.

Ja, die Endversion kann also einige Sicherheitsaspekte enthalten.

1voto

Katie Punkte 452

Das Schlüsselwort Final wird in der Regel verwendet, um die Unveränderlichkeit zu erhalten. Die Verwendung von final für Klassen oder Methoden soll verhindern, dass Verknüpfungen zwischen Methoden unterbrochen werden. Nehmen wir zum Beispiel an, dass die Implementierung einer Methode der Klasse X davon ausgeht, dass sich die Methode M auf eine bestimmte Weise verhält. Wenn Sie X oder M als final deklarieren, verhindern Sie, dass abgeleitete Klassen M so umdefinieren, dass X sich nicht mehr korrekt verhält. Dies schützt Objekte und Methoden vor Manipulationen. Für kryptografische Zwecke ist die Verwendung des Schlüsselworts final jedoch nicht die Lösung

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