Доступ к закрытым статическим методам из открытого статического контекста - PullRequest
4 голосов
/ 14 мая 2009

Рассмотрим этот пример класса,

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

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

Ответы [ 2 ]

8 голосов
/ 14 мая 2009

Хорошо, используйте 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 должно помочь.

4 голосов
/ 14 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...