Замена для менеджера безопасности checkMemberAccess()

Метод диспетчера безопасности Java checkMemberAccess() имел параметр, содержащий класс, к которому вызывалось Reflection. Этот метод устарел, и в описании говорилось, что вместо него следует использовать checkPermission(). В checkPermission() нет параметров, аналогичных параметрам в checkMemberAccess().

Как в диспетчере безопасности получить целевой класс Reflection без checkMemberAccess()?

т. е. если класс A выполняет отражение в классе B, я хочу знать, что target был классом B.


person Strikegently    schedule 17.12.2018    source источник


Ответы (1)


Когда вы устанавливаете диспетчер безопасности по умолчанию, приложение использует политику безопасности по умолчанию. Если вы хотите предоставить нашу собственную политику, вы можете сделать это в файле политики, записанном как:

grant {
   permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
   permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

CheckMemberAccess имеет политику по умолчанию — разрешать доступ к членам PUBLIC, а также доступ к классам, которые имеют тот же загрузчик классов, что и вызывающая сторона. Во всех остальных случаях этот метод вызывает checkPermission() с разрешением RuntimePermission("accessDeclaredMembers").

Для отражающих операций используйте класс ReflectPermission и suppressAccessChecks, которые позволяют подавлять стандартные проверки доступа Java — для общедоступных, защищенных и частных членов, доступ по умолчанию — выполняемые отраженными объекты в месте их использования.

Но это опасно тем, что информация (возможно, конфиденциальная) и обычно недоступные методы могут стать доступными для вредоносного кода.

После того, как вы предоставили файл политики, вы можете проверить его следующим образом:

 try {
   ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
   permission.checkGuard(null);
   System.out.println("Permission granted");
 } catch (SecurityException e) {
   System.out.println("Permission denied");
 }
person Tamara Koliada    schedule 26.12.2018
comment
Я хочу разрешить отражение для всех классов, но заблокировать отражение для определенного набора классов. Могу ли я это сделать или мне нужны тысячи записей в этом блоке grant? - person Strikegently; 02.01.2019
comment
Есть несколько других способов заблокировать операции отражения: 1)setAccessible() 2) аннотированный класс RetentionPolicy получает атрибут класса RuntimeInvisible \ RuntimeVisible или не будет отображаться в декомпилированном классе 3) Используйте концепцию module в Java 9 и разрешения на отражение - person Tamara Koliada; 02.01.2019