2009-05-14 3 views
4

Рассмотрим этот класс образца,Доступ частных статических методов из публичного статического контекста

class TargetClass { 
    private static String SENSITIVE_DATA = "sw0rdfish"; 

    private static String getSensitiveData() { 
     return SENSITIVE_DATA; 
    } 
} 

Когда я делаю это,

import java.lang.reflect.Method; 

public class ClassPiercing { 

    public static void main(String... args) throws Exception { 
     Class targetClass = Class.forName("TargetClass"); 
     Method[] methods = targetClass.getDeclaredMethods(); 
     methods[0].setAccessible(true); 
     String sensitiveData = (String)methods[0].invoke(null, null); 
     System.out.println("Sensitive Data: " + sensitiveData); 
    } 
} 

Выход,

Sensitive Data: sw0rdfish 

Это опасно , Как я могу предотвратить это?

+1

Не используя отражение? –

+0

Да, конечно, если программисты единомышленно так думают – Joset

ответ

8

Ну, используйте SecurityManager.

http://java.sun.com/javase/6/docs/api/java/lang/SecurityManager.html

http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html#ReflectPermission

отключение ReflectPermission следует сделать трюк.

+0

решает вопрос, но вы все равно можете разобрать класс (или просто использовать текстовый редактор, чтобы увидеть, что там есть) –

+1

Да; глупо хранить пароль в статическом финальном поле с любой точки зрения. – alamar

+0

Это просто пример. Вы знаете, какова реальная импликация. – Joset

4

Точка контроля доступа не должна помешать кому-то взломать ваш код; Это вопрос сигнализации для других программистов (например, api design). Если вы не доверяете другой программе, вам следует использовать различные меры. Например, вы можете каким-то образом зашифровать данные.

Смежные вопросы