Куда идет ESAPI.properties в проекте Java Google AppEngine

Мой проект работает на сервере разработки. Он работает в обоих следующих случаях:

  1. С каталогом .esapi в исходном пути, чтобы он попал в WEB-INF/classes
  2. С каталогом .esapi в корне библиотеки, чтобы он оказался в WEB-INF/lib

Однако он не работает при развертывании в Google (с использованием любой из двух вышеперечисленных стратегий).

Я получаю обычные сообщения о том, что не могу найти ESAPI. properties, когда я впервые пытаюсь использовать ESAPI после развертывания в Google.

Attempting to load ESAPI.properties via file I/O.
Attempting to load ESAPI.properties as resource file via file I/O.
Not found in 'org.owasp.esapi.resources' directory or file not readable: /base/data/home/ap
Not found in SystemResource Directory/resourceDirectory: .esapi/ESAPI.properties
Loading ESAPI.properties via file I/O failed. Exception was: java.io.FileNotFoundException
Attempting to load ESAPI.properties via the classpath.
ESAPI.properties could not be loaded by any means. Fail. Exception was: java.security.Acces

Похоже, что ESAPI включает изменения для поддержки AppEngine http://goo.gl/rD8dz.

Обновление Проблема заключается в том, что строка 603 файла org.owasp.esapi.reference.DefaultSecurityConfiguration вызывает ClassLoader.getSystemClassLoader(), что недопустимо в Google Appengine. Это вызывает исключение выше (извините, оно обрезано). В массив предварительно загружаются три ClassLoader, прежде чем код попытается получить ресурсы.

    ClassLoader[] loaders = new ClassLoader[] {
            Thread.currentThread().getContextClassLoader(),
            ClassLoader.getSystemClassLoader(),
            getClass().getClassLoader() 
    };
    String[] classLoaderNames = {
            "current thread context class loader",
            "system class loader",
            "class loader for DefaultSecurityConfiguration class"
    };

Я взломал свою собственную копию DefaultSecurityConfiguration, где я удалил SystemClassLoader (и соответствующее classLoaderName) из метода loadConfigurationFromClasspath.

    ClassLoader[] loaders = new ClassLoader[] {
            Thread.currentThread().getContextClassLoader(),
            getClass().getClassLoader() 
    };
    String[] classLoaderNames = {
            "current thread context class loader",
            "class loader for DefaultSecurityConfiguration class"
    };

По иронии судьбы, именно потому, что они упростили чтение/расширение кода (ИМХО), зациклившись на загрузчиках классов, этот подход терпит неудачу. У меня возникает соблазн отправить патч с внутренним классом, чтобы отложить вызов getSystemClassLoader (чего нельзя сделать в AppEngine).

Интересно, что это работает так, как это возможно только потому, что банка esapi не запечатана. Я бы подумал, что банка с библиотекой безопасности должна быть запечатана. Может быть, я использую неправильный!

Обновление Я использую банку esapi через maven, она была переупакована и не подписана. Не идеально, но не менее безопасно, чем другие 40 банок с открытым исходным кодом, которые я получаю от maven!


person byeo    schedule 21.02.2012    source источник


Ответы (5)


Ваше решение переопределить класс DefaultSecurityConfiguration вашей собственной реализацией — это правильный способ решения проблемы. Именно по этой причине он разработан таким образом. Есть и другие неотъемлемые проблемы с использованием ESAPI в Google App-Engine, в первую очередь в отношении шифрования/хеширования. Эта проблема была «частично» решена в соответствии с комментариями к этой ветке (http://code.google.com/p/googleappengine/issues/detail?id=1612), но по-прежнему существуют серьезные ограничения на использование шифрования в GAE.

person Chris Schmidt    schedule 07.03.2012
comment
Я не переопределяю в объектно-ориентированном смысле, я заменил класс своим собственным клоном и изменил 2 строки. т.е. то же имя класса тот же пакет. Это работает, только если EASPI.jar не запечатан. Я не горжусь этим хаком, но я буду жить :-/ - person byeo; 09.03.2012
comment
означает ли это, что ESAPI 2.1.0 в настоящее время не может быть реализован на AppEngine без изменения jar-файла? @ChrisSchmidt является одним из самых заслуживающих доверия людей чтобы ответить на этот вопрос. - person Abel Callejo; 08.01.2014
comment
Извиняюсь за очень поздний ответ здесь - последние несколько месяцев я был заперт в подвале, кодируя, и сегодня они наконец выпустили меня на воздух! :) Чтобы ответить на ваш вопрос, вам не нужно изменять JAR для развертывания ESAPI 2.1.0 в приложении GAE, но, по моему опыту, вам нужно написать собственную реализацию шифратора, которая не использует какие-либо криптобиблиотеки (по сути, недействующий шифратор). Я не проверял никакие современные версии GAE, так что это могло измениться с тех пор, как я последний раз проверял. - person Chris Schmidt; 08.05.2014

Я только что успешно интегрировал ESAPI 2.1.0 в проект Google App Engine и даже не использовал для этого Maven.

Поместите файлы ESAPI.properties и validation.properties в каталог [gae-project]/war/ESAPI/. Таким образом, полный путь к ESAPI.properties будет

[gae-project]/war/ESAPI/ESAPI.properties

Помещение его под тегом war/ гарантирует, что файлы будут загружены в Google.

Отредактируйте файл appengine-web.xml, добавив следующие строки в корневой узел <appengine-web-app>

...
<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    <property name="org.owasp.esapi.resources" value="ESAPI" />
</system-properties>
<static-files>
    <exclude path="/ESAPI**properties" />
</static-files>
...

это позволит App Engine распознавать файлы .properties как файлы проекта.

для более подробного обсуждения вы также можете прочитать Руководство по интеграции ESAPI для Google App Engine

person Abel Callejo    schedule 09.01.2014

Вы можете поместить файлы в каталог META-INF/, а затем изменить системное свойство org.owasp.esapi.resources на META-INF/ в appengine-web.xml следующим образом:

    <system-properties>
      <property name="org.owasp.esapi.resources" value="META-INF/" />
    </system-properties>

Поскольку DefaultSecurityConfiguration сначала ищет файлы конфигурации в Каталоге ресурсов, а затем в пути к классам.

person Mohamed Abdennebi    schedule 05.06.2013
comment
в App Engine каталог WEB-INF имеет путь [project]/war/WEB-INF, а каталог META-INF обычно имеет путь [project]/war/WEB-INF/classes/META-INF. разве это не должно быть <property name="org.owasp.esapi.resources" value="WEB-INF/classes/META-INF/" /> ? - person Abel Callejo; 07.01.2014

Следующие шаги сработали для меня.

  1. Извлеките банку
  2. создать одну папку .esapi
  3. скачать ESAPI.properties
  4. создать банку.
  5. Используйте его, он больше не будет жаловаться на отсутствие файла свойств.
person Nethaji Narasimalu    schedule 01.07.2014

В нашем проекте файл находится в папке WEB-INF/classes. Мы не используем подпапку .esapi.

Версия Esapi=2.0.1

Однако развернуто в jboss.

person tom    schedule 21.02.2012
comment
Да, я пробовал это, я обновлю свой список стратегий выше. - person byeo; 22.02.2012