Как ограничить разработчиков использовать отражение для доступа к закрытым методам и конструкторам в Java? - PullRequest
23 голосов
/ 27 сентября 2011

Как запретить разработчикам использовать отражение для доступа к закрытым методам и конструкторам в Java?

Используя обычный код Java, мы не можем получить доступ к закрытым конструкторам или закрытым методам вне класса.Но с помощью отражения мы можем получить доступ к любым закрытым методам и конструкторам в классе Java.

Так как же мы можем обеспечить безопасность нашего кода Java?

Ответы [ 3 ]

18 голосов
/ 27 сентября 2011

Запустите ваше приложение, используя SecurityManager и достаточно ограничительную политику безопасности .

В учебном пособии краткая сводка и обширная информация в документации по безопасности .

7 голосов
/ 27 сентября 2011

Добавьте checkPermission() метод во все ваши приватные методы / конструкторы.checkPermission используя sun.reflect.Reflection.getCallerClass(int n) by assert callerClass=selfClass.

. getCallerClass возвращает класс метода realFramesToSkip, кадрирует стек (начиная с нуля), игнорируя кадры, связанные с java.lang.reflect.Method.invoke(), и его реализацию,Первый кадр связан с этим методом, поэтому getCallerClass(0) возвращает объект класса для sun.reflect.Reflection.

public class PrivateConstructorClass {

    private PrivateConstructorClass() {
        checkPerMission();
              //you own code go below
    }

    void checkPerMission() {
        Class self = sun.reflect.Reflection.getCallerClass(1);
        Class caller = sun.reflect.Reflection.getCallerClass(3);
        if (self != caller) {
            throw new java.lang.IllegalAccessError();
        }
    }
}

Вы можете попробовать проверить отражение, оно не будет выполнено:

public class TestPrivateMain {

    Object newInstance() throws Exception {

        final Class<?> c = Class.forName("package.TestPrivate");

        final Constructor<?> constructor = c.getDeclaredConstructor();
        constructor.setAccessible(true);
        return constructor.newInstance();

    }

    public static void main(String[] args) throws Exception {
        Object t = new TestPrivateMain().newInstance();
    }
} 
1 голос
/ 27 сентября 2011

Вы (как разработчик рассматриваемого кода) не можете этого сделать.

Конечный пользователь, который запускает приложение, может установить SecurityManager, запрещающий отражение.

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