Ich habe eine Frage, die mich nun schon seit Stunden beschäftigt. Bei der Frage dreht es sich um Reflections.
Ich bin mir nicht sicher, ob ich Reflections bisher nicht bis ins Detail begriffen habe, oder ob Reflections ein Sicherheitsproblem schaffen, wie es für Java eigentlich untypisch ist.
Zwecks Selbststudium habe ich folgende Code erzeugt.
1.) Ein Test-Objekt mit einer privaten Variablen, die im Konstruktor initialisiert wird:
Nun ist davon auszugehen, dass die Variable secret (da private deklariert) von niemandem, außer dem Klassenprogrammierer von TestObject, einzusehen oder (noch schlimmer) zu verändern ist (Java-Geheimnisprinzip).
Nehmen wir an die Variable secret würde einen sensiblen Wert beinhalten. Nachdem ich (in der hypothetischen Person eines Hackers) nun den folgenden Code erzeugt habe, wurde ich für lange Zeit sehr Nachdenklich.
2.) Das Programm mit der main-Methode, welches an dieser Stelle stellvertretend für eine beliebige Klasse mit Referenz auf TestObject stehen soll:
Über Reflection, die jedem Programmierer zugänglich ist, kann ich also private Variablen einer fremden Klasse ändern, ohne dass der Klassenprogrammierer ausdrücklich zugestimmt hat?
Der Java Optionsschalter –Djava.security.manager kann dies zwar verhindern (=> java.security.AccessControlException), der Klassenprogrammierer hat auf diesen Schalter jedoch wenig Einfluss, wenn das Programm auf einem Clientrechner läuft.
Habe ich etwas falsch verstanden, oder hätte Sun den expliziten Zugriff auf geschützte Variablen und Methoden (Zugriffs-Modifizierer package, protected oder private) nicht auch nur dann gestatten können, wenn der Klassenprogrammierer dem auch zustimmt (z.B. durch implementieren eines Funktionslosen Interfaces, wie dies beispielsweise auch bei Cloneable passiert ist)?
Wenn ich derzeit nichts übersehen habe, stehen dann nicht Cloneable und Reflections in einem (auf Prinzipfragen beruhendem) direkten Widerspruch zueinander?
Ich danke bereits jetzt für jede Antwort, die meine geistige Verwirrung offenbart ;-)
Ich bin mir nicht sicher, ob ich Reflections bisher nicht bis ins Detail begriffen habe, oder ob Reflections ein Sicherheitsproblem schaffen, wie es für Java eigentlich untypisch ist.
Zwecks Selbststudium habe ich folgende Code erzeugt.
1.) Ein Test-Objekt mit einer privaten Variablen, die im Konstruktor initialisiert wird:
Code:
public class TestObject{
private int secret;
public TestObject(int secret){
this.secret = secret;
}
}
Nehmen wir an die Variable secret würde einen sensiblen Wert beinhalten. Nachdem ich (in der hypothetischen Person eines Hackers) nun den folgenden Code erzeugt habe, wurde ich für lange Zeit sehr Nachdenklich.
2.) Das Programm mit der main-Methode, welches an dieser Stelle stellvertretend für eine beliebige Klasse mit Referenz auf TestObject stehen soll:
Code:
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
public class ReflectionTest{
public static void main(String[] args){
TestObject to = new TestObject(10);
Class c = to.getClass();
try{
Field f = c.getDeclaredField("secret");
f.setAccessible(true);
System.out.println(f.getName() + "=" + f.get(to));
f.setInt(to, 20);
System.out.println(f.getName() + "=" + f.get(to));
}catch(NoSuchFieldException nsfe){
System.out.println(nsfe);
}catch(IllegalAccessException iae){
System.out.println(iae);
}
}
}
Der Java Optionsschalter –Djava.security.manager kann dies zwar verhindern (=> java.security.AccessControlException), der Klassenprogrammierer hat auf diesen Schalter jedoch wenig Einfluss, wenn das Programm auf einem Clientrechner läuft.
Habe ich etwas falsch verstanden, oder hätte Sun den expliziten Zugriff auf geschützte Variablen und Methoden (Zugriffs-Modifizierer package, protected oder private) nicht auch nur dann gestatten können, wenn der Klassenprogrammierer dem auch zustimmt (z.B. durch implementieren eines Funktionslosen Interfaces, wie dies beispielsweise auch bei Cloneable passiert ist)?
Wenn ich derzeit nichts übersehen habe, stehen dann nicht Cloneable und Reflections in einem (auf Prinzipfragen beruhendem) direkten Widerspruch zueinander?
Ich danke bereits jetzt für jede Antwort, die meine geistige Verwirrung offenbart ;-)