Java Security Manager полностью отключил отражение
Я читал довольно много вопросов на Stackru по этому вопросу, но не смог найти решение или ответ на мою проблему. Если бы он уже был, я был бы признателен, если бы кто-нибудь дал подсказку...
Моя проблема / вопрос в том, возможно ли полностью отключить отражение для ненадежного кода? Функции как getDeclaredMethods()
(См. Test.java). У меня уже есть менеджер безопасности Java, который выдает исключения безопасности, если код пытается написать / прочитать / и т.д....
Если это возможно, может кто-нибудь показать мне, как?
Bruno
test.java
TestClass cls = new TestClass();
Class c = cls.getClass();
// returns the array of Method objects
Method[] m = c.getDeclaredMethods();
for(int i = 0; i < m.length; i++) {
System.out.println("method = " + m[i].toString());
}
3 ответа
Поэтому я решил проблему не напрямую с помощью checkPermission(). Мой обходной путь - проверить, доступен ли пакет java.lang.reflect.
@Override
public void checkPackageAccess(String pkg){
// don't allow the use of the reflection package
if(pkg.equals("java.lang.reflect")){
throw new SecurityException("Reflection is not allowed!");
}
}
Расширьте свой SecurityManager и сделайте так, чтобы он проверял ReflectPermission
а также RuntimePermission
, Затем вы должны решить, есть ли у вызывающего абонента разрешение на Reflection:
@Override
public void checkPermission(Permission perm) {
if (perm instanceof ReflectPermission) {
// called for Method.setAccessible(true)
// determine whether caller is permitted using getClassContext()
}
if (perm instanceof RuntimePermission) {
if (perm.implies(new RuntimePermission("accessDeclaredMembers"))) {
// called for Class.getDeclardFields()
System.out.println("getDeclaredFields() called");
}
}
Пока мы не предоставляем менеджера безопасности, частные члены класса могут быть доступны. Для доступа к закрытым членам класса вы должны установить setAccessible (true), это позволит вам получить доступ к закрытым членам. Ограничение доступа к закрытым членам. Оставьте строчку кода в своем неизменяемом конструкторе классов.
System.setSecurityManager (новый SecurityManager());
Это вызовет исключение AccessControlException при попытке установить setAccessible(true).