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

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

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

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

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");
 }
Другие вопросы по тегам