Как подавить вывод сообщений библиотекой ESAPI

Кто-нибудь знает, как подавить следующие шумные сообщения, выводимые библиотекой ESAPI?

System property [org.owasp.esapi.opsteam] is not setAttempting to load ESAPI.properties via file I/O.
Attempting to load ESAPI.properties as resource file via file I/O.

System property [org.owasp.esapi.devteam] is not set
Not found in 'org.owasp.esapi.resources' directory or file not readable: C:\Users\ktamura\Desktop\embtest-master\ESAPI.properties
Not found in SystemResource Directory/resourceDirectory: .esapi\ESAPI.properties
Not found in 'user.home' (C:\Users\ktamura) directory: C:\Users\ktamura\esapi\ESAPI.properties
Loading ESAPI.properties via file I/O failed. Exception was: java.io.FileNotFoundException
Attempting to load ESAPI.properties via the classpath.
SUCCESSFULLY LOADED ESAPI.properties via the CLASSPATH from '/ (root)' using current thread context class loader!
SecurityConfiguration for Validator.ConfigurationFile.MultiValued not found in ESAPI.properties. Using default: false
Attempting to load validation.properties via file I/O.
Attempting to load validation.properties as resource file via file I/O.
Not found in 'org.owasp.esapi.resources' directory or file not readable: C:\Users\ktamura\Desktop\embtest-master\validation.properties
Not found in SystemResource Directory/resourceDirectory: .esapi\validation.properties
Not found in 'user.home' (C:\Users\ktamura) directory: C:\Users\ktamura\esapi\validation.properties
Loading validation.properties via file I/O failed.
Attempting to load validation.properties via the classpath.
validation.properties could not be loaded by any means. fail. Exception was: java.lang.IllegalArgumentException: Failed to load ESAPI.properties as a classloader resource.

Я добавил библиотеку в свое веб-приложение (включая встроенный Tomcat), и проверка ESAPI работает, но выводятся зашумленные сообщения.

Код Java:

writer.write(ESAPI.encoder().encodeForHTML("<test>"));

Зависимость ESAPI:

<dependency>
    <groupId>org.owasp.esapi</groupId>
    <artifactId>esapi</artifactId>
    <version>2.1.0.1</version>
</dependency>

ESAPI.properties:

https://github.com/k-tamura/embtest/blob/master/src/main/resources/ESAPI.properties

Действия для воспроизведения:

(1) Запустите команды:

$ git clone https://github.com/k-tamura/embtest.git
$ cd embtest
$ mvn clean install

(2) Доступ к http://localhost:8080/ping -> Приведенные выше журналы отображаются на консоли.

Среда (мой локальный компьютер):

$ mvn -version
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T22:51:42+09:00)
Maven home: c:\apache-maven-3.2.2
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: c:\Program Files\Java\jdk1.8.0_121\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"

person Kohei TAMURA    schedule 24.08.2017    source источник


Ответы (2)


Вас укусил сценарий курицы и яйца. Эти утверждения исходят из комбинации System.out.println() и System.err.println().

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

Таким образом, мы по умолчанию используем единственный другой вариант — вывод на консоль.

В прошлом мы удалили его, но затем список рассылки был завален сообщениями «Мое приложение не запускается, HEEEEELP!»

Итак, они вернулись и никуда не денутся: фича не баг.

Если вы НАСТОЛЬКО полны решимости избавиться от сообщений о поиске файлов, я предлагаю перенаправить потоки вывода, как это делается здесь

OutputStream output = new FileOutputStream("/dev/null");
PrintStream printOut = new PrintStream(output);

System.setOut(printOut);

Отказ от ответственности: я являюсь одним из руководителей ESAPI-java.

person avgvstvs    schedule 24.08.2017
comment
Спасибо за совет (проголосовал +1). Я могу обойти эту проблему (см. Также мой ответ). Тем не менее, я думаю, что есть возможности для улучшения обработки загрузки ESAPI. - person Kohei TAMURA; 25.08.2017
comment
Во что бы то ни стало @KoheiTAMURA -- Сейчас в проекте только двое из нас! Мы можем использовать помощь! - person avgvstvs; 25.08.2017

Я могу обойти эту проблему, чтобы добавить InitializationListener, обратившись к ответу @avgvstvs:

import java.io.OutputStream;
import java.io.PrintStream;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.owasp.esapi.ESAPI;

@WebListener
public class InitializationListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {

        /* Suppress noisy messages output by the ESAPI library. */
        PrintStream original = System.out;
        try (PrintStream out = new PrintStream(new OutputStream() {
            @Override
            public void write(int b) {
                // Do nothing
            }
        })) {
            System.setOut(out);
            System.setErr(out);
            ESAPI.encoder();
        } catch (Exception e) {
            // Do nothing
        } finally {
            System.setOut(original);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // Do nothing
    }
}
person Kohei TAMURA    schedule 25.08.2017
comment
Чтобы добавить к тому, что сказал Мэтт, в следующем выпуске ESAPI (который мы надеемся выпустить по крайней мере через несколько месяцев, надеюсь, раньше) вы сможете создать подкласс DefaultSecurityConfiguration, переопределить (теперь «защищенный») logSpecial() метод, чтобы не войти в систему вообще. Причина, по которой он не может перейти к регистратору, заключается в том, что 1) он не может переключать типы ведения журнала в середине потока (на выбор JUL или log4j) и 2) он не знает предпочтительный регистратор, пока не найдет его в вашем ESAPI. файл свойств. Вам также придется сделать дополнительный вызов ESAPI.initialize() с именем вашего подкласса. - person Kevin W. Wall; 25.08.2017
comment
OTOH, чтобы не приуменьшать это, но большинство людей просто перенаправляют stdout и stderr в файл web, их сервер приложений Java запускается, и по сравнению со всем, что Tomcat / WebSphere / WebLogic Server и т. д. испускает в stdout и stderr, это но капля в море. Однако большинство людей предпочли бы слишком много журналирования, чем недостаточно. - person Kevin W. Wall; 25.08.2017
comment
Этот новый выпуск ESAPI все еще находится в пути? - person Rüdiger Schulz; 22.06.2018
comment
Вы забыли установить Err там! - person Jonathan Drapeau; 17.05.2019
comment
@KevinW.Wall В моем случае все регистрируется в консоли в формате json и отправляется в централизованный диспетчер журналов. Раздражает разрушать часть журналов причиной этого. - person Jonathan Drapeau; 17.05.2019