Могу ли я отказать в доступе к классу jvm, настроив файл java.policy? - PullRequest
3 голосов
/ 14 июня 2009

Я хотел добавить в свой файл jdk6\jre\lib\security\java.policy запрет на создание некоторых классов, занесенных в черный список appengine. Например, я хочу, чтобы мой локальный jvm генерировал исключение, когда приложение пытается создать экземпляр javax.naming.NamingException.

Это возможно?

Я попытаюсь объяснить мою конкретную проблему здесь. Google предлагает сервис (механизм приложений GAE-google), который имеет некоторые ограничения на то, какие классы можно использовать. Например, не создает экземпляры классов JNDI, которые находятся в пакете javax.naming. Они также предлагают тестовый сервер, который можно использовать для тестирования этого приложения на моем компьютере, но этот сервер допускает такие классы и может выполнять код. Вы обнаружите, что использовали класс из черного списка только после загрузки приложения в Google. Я подумал, нельзя ли реализовать такой черный список классов при разработке jvm. Еще я думаю, что это будет легко, они могут уже предоставить такой файл политики.

Ответы [ 3 ]

6 голосов
/ 17 июня 2009

Вы можете написать небольшое приложение-загрузчик, которое создаст новый пользовательский загрузчик классов . Классы вашего приложения могут быть загружены с помощью этого загрузчика классов.

В пользовательском загрузчике классов вы можете затем генерировать ClassNotFoundException, когда ваше приложение пытается получить доступ к классу, который вы хотите поместить в черный список.

Вам потребуется перегрузить метод load (). Этот метод будет отвечать за создание исключения в ваших занесенных в черный список классах или за передачу родительского загрузчика классов, если класс разрешен. Пример реализации:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(Конечно, реальная реализация может быть более сложной, чем эта)

Поскольку классы вашего приложения загружаются через этот Classloader, и вы делегируете вызовы loadClass () родительскому загрузчику классов, когда вы хотите, вы можете занести в черный список любые нужные вам классы.

Я почти уверен, что это метод, который Google использует для внесения в черный список классов на их сервере. Они загружают каждое приложение в определенный Classloader. Это также похоже на способ, которым Tomcat изолирует различные веб-приложения.

1 голос
/ 19 июня 2009

Разве вы не предпочли бы получать ошибки компиляции, чем ошибки времени выполнения при тестировании вашей программы? Вы можете настроить IDE или компилятор так, чтобы он предупреждал вас о создании нежелательного класса. Я знаю, что в AspectJ есть несколько приятных особенностей: вы можете определять предупреждения / ошибки компиляции в точках соединения и получать обратную связь, например, в. Затмение. Чтобы использовать это в Eclipse, вы просто устанавливаете плагин AspectJ и пишете подходящий аспект. Чтобы получить ошибки при компиляции из командной строки или скрипта, вам, фактически, придется использовать компилятор AspectJ, но я сомневаюсь, что вам это понадобится.

0 голосов
/ 15 июня 2009

Документация Java перечисляет все возможные разрешения политики здесь: http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

Создание / загрузка класса не упоминается, поэтому я считаю, что вы не можете применить это с помощью политики.

В любом случае, почему вы хотите вызвать исключение при загрузке класса исключения? Возможно, вы могли бы объяснить свою проблему, тогда кто-то может предложить решение.

Edit:

Один из способов предотвратить загрузку определенных классов - удалить их из установки JRE. Большинство системных классов содержатся в rt.jar в вашей установке JDK / JRE. Вы сможете изменить его с помощью любого ZIP-инструмента.

Просто создайте специальную установку вашего JRE и измените его rt.jar. Это ужасный хак, но для целей тестирования все должно быть в порядке ...

...