2016-07-14 23 views
2

Ich lese gerade die CERT Secure Coding Standard for Java.Wie können Referenzen auf private Klassenmitglieder gefährlich sein

Ich kämpfe mit diesem rule. Der Schweregrad dieser Regel ist hoch, was bedeutet, dass ein Verstoß gegen diese Regel zu einer Eskalation oder Ausführung von Code führen kann.

Ich verstehe nicht wirklich, wie eine Verletzung dieser Regel zu solchen fatalen Dingen führen kann. Kann jemand ein Beispiel für einen Angriff auf einen Code geben, der gegen diese Regel verstößt?

+2

Es gibt bereits Beispiele auf der Seite, mit der Sie verbunden sind. Was ist los mit denen? –

+0

Wenn Sie den Verweis auf das private veränderbare Objekt, wie "Datum" oder irgendeine modifizierbare "Sammlung", verfügbar machen, können Sie den Zustand Ihres Objekts von außen ändern. Stellen Sie sich vor, Sie haben die Methode 'List getNames()', Sie können sie aufrufen und dann 'add (" name ")' aufrufen. Die Person, die Ihre Klasse verwendet, kann den internen Status der Instanz ändern. Siehe auch J. ** Blochs "Effective Java" 2. Ausgabe, Item 39, p. 184 ** –

+0

nicht die Beispiele führen zu einer Code-Ausführung oder einer Privilegeskalation oder liege ich falsch? – Exagon

Antwort

2

Sie könnten eine Invariante haben, die Sie im Konstruktor der Klasse festlegen, z. dass date die Erstellungszeit der Instanz enthält:

class Foo { 
    private final Date date; 

    Foo() { this.date = new Date(); } 

    Date getDate() { return date; } 
} 

Nun, wenn ich getDate().setTime(0) nennen, kann ich die Instanz so aussehen, wie es bei 1970-1-1 00:00:00Z erstellt wurde.

Wenn Sie eine Logik haben, die auf dem Erstellungsdatum eines Foo basiert, kann es manipuliert werden, um sich auf diese Weise anders zu verhalten.

0

In Java umgehen Sie den private-Bezeichner, indem Sie eine nicht-private-Funktion haben, die einen Verweis auf das Element zurückgibt.

Das ist, weil es möglich ist, das Objekt zu ändern, auf das das Mitglied durch diese Referenz verweist.

Sie können auch über Dinge ehrlich sein, und markieren Sie die private Mitglied mit dem gleichen Access Specifier wie die Funktion.

2

Wenn Sie den Verweis auf das private veränderbare Objekt (z. B. Date oder beliebige änderbare Collection) über den Getter bereitstellen, können Sie den Zustand Ihres Objekts von außen ändern.

Stellen Sie List<String> getNames() Methode in der Klasse haben:

public class MyClass { 
    // fields and constructors are omitted 
    List<String> getNames() { 
     // return any mutable List implementation; for instance, ArrayList 
    } 
} 

Sie myClass.getNames().add("name") nennen kann, und dies wird den Zustand der MyClass Instanz ändern. Die Person, die Ihre Klasse verwendet, kann den internen Status ihrer Instanzen ändern.

Siehe auch J. Blochs "Effective Java" 2nd edition, Item 39 "Erstellen Sie defensive Kopien, wenn nötig", p. 184, dort finden Sie sehr gute Erläuterungen zu diesem Tiopic.