Ссылка на переменные среды в web.xml

  1. Выполнение недоверяемый код в его собственном потоке. Это, например, предотвращает проблемы с бесконечными циклами и таким, и делает будущие шаги легче. Имейте основной поток, ожидают потока для окончания, и если занимает слишком много времени, уничтожьте его с Thread.stop. Thread.stop удерживается от использования, но так как недоверяемый код не должен иметь доступа ни к каким ресурсам, будет безопасно уничтожить его.

  2. Набор SecurityManager на том Потоке. Создайте подкласс SecurityManager, который переопределяет checkPermission (Разрешение перманент) для простого броска SecurityException для всех полномочий кроме выбора немногие. Существует список методов и полномочий, которых они требуют здесь: Полномочия в Java ТМ глоток> 6 SDK.

  3. Использование пользовательский ClassLoder для загрузки недоверяемого кода. Ваш загрузчик класса требоваться все классы, которые использует недоверяемый код, таким образом, можно сделать, вещам нравится, отключают доступ к отдельным классам JDK. Нужно, имеют белый список позволенных классов JDK.

  4. Вы могли бы хотеть выполнить недоверяемый код в отдельной JVM. В то время как предыдущие шаги сделали бы код безопасным, существует одна раздражающая вещь, которую может все еще сделать изолированный код: выделите столько памяти, сколько она может, который заставляет видимое место главного приложения расти.

  5. JSR 121: спецификация API Изоляции приложения была разработана для решения этого, но к сожалению она еще не имеет реализации.

    Это - довольно подробная тема, и я главным образом пишу это все первое, что пришло на ум.

    , Но так или иначе, некоторый имперфект, use-at-your-own-risk, вероятно, ошибочный (псевдо) код:

    ClassLoder

    class MyClassLoader extends ClassLoader {
      @Override
      public Class loadClass(String name) throws ClassNotFoundException {
        if (name is white-listed JDK class) return super.loadClass(name);
        return findClass(name);
      }
      @Override
      public Class findClass(String name) {
        byte[] b = loadClassData(name);
        return defineClass(name, b, 0, b.length);
      }
      private byte[] loadClassData(String name) {
        // load the untrusted class data here
      }
    }
    

    Поток SecurityManager

    class MySecurityManager extends SecurityManager {
      private Object secret;
      public MySecurityManager(Object pass) { secret = pass; }
      private void disable(Object pass) {
        if (pass == secret) secret = null;
      }
      // ... override checkXXX method(s) here.
      // Always allow them to succeed when secret==null
    }
    

    class MyIsolatedThread extends Thread {
      private Object pass = new Object();
      private MyClassLoader loader = new MyClassLoader();
      private MySecurityManager sm = new MySecurityManager(pass);
      public void run() {
        SecurityManager old = System.getSecurityManager();
        System.setSecurityManager(sm);
        runUntrustedCode();
        sm.disable(pass);
        System.setSecurityManager(old);
      }
      private void runUntrustedCode() {
        try {
          // run the custom class's main method for example:
          loader.loadClass("customclassname")
            .getMethod("main", String[].class)
            .invoke(null, new Object[]{...});
        } catch (Throwable t) {}
      }
    }
    
34
задан John Saunders 18 July 2014 в 23:00
поделиться

1 ответ

Я думаю, вы не хотите использовать переменные среды (которые, как мне кажется, недоступны из web.xml), но записи среды [ 1 ], 2 ]. примерно так:

<env-entry>
    <env-entry-name>Bla/SomeFilePath</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/opt/bla</env-entry-value>
</env-entry>

вы можете использовать SomeFilePath, например:

InitialContext ic = new InitialContext();
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath");
12
ответ дан 27 November 2019 в 16:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: