Refleksja może być niebezpieczna - zobacz jak zniszczyć sobie życie
16 maja 2011, 20:10:28, Patryk Dobrowolski « No Scope registered for scope 'session'Reflection API to mocarne narzędzie. Pozwala badać i modyfikować zachowanie obiektów w uruchomionym środowisku. Umożliwia dostęp do prywatnych pól i metod, co jest bardzo często wykorzystywane przez różnej maści frameworki i biblioteki. Czasami kilka linii z wykorzystaniem Reflection API pozwala zastąpić dziesiątki linii kodu i klas napisanych standardowym sposobem. Jego użycie zalecane jest doświadczonym programistom z dobrą znajomością Javy. I czasem może być niebezpieczne.
public class Main {
private static Integer multiply(Integer a, Integer b) {
return a * b;
}
public static void main(String[] args) throws Exception {
Field field;
field = String.class.getDeclaredField("value");
field.setAccessible(true);
field.set(" world", " hell".toCharArray());
field.setAccessible(false);
field = String.class.getDeclaredField("count");
field.setAccessible(true);
field.set(" world", 5);
field.setAccessible(false);
field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
field.set(Integer.valueOf(0), 10);
field.setAccessible(false);
System.out.println("Hello " + multiply(0, 0) + " world");
}
}
Kto zgadnie co wyrzuci na konsolę metoda main()?
A teraz wystarczy sobie wyobrazić, że posiada się jakiś serwis u usługodawcy ze współdzieloną maszyną wirtualną, i na dodatek współdzieli się ją z kimś złośliwym.
Komentarze
a co z security managerem? strzelam, ze dobrze skonfigurowane uprawnienia nie pozwola na cos takiego na wspoldzielonym serwerze. ale przyznaje, ze nigdy nie zajmowalem sie konfiguracja uprawnien wiec to tylko moje pobozne zyczenia