【问题标题】:How to suppress messages output by ESAPI library如何抑制 ESAPI 库输出的消息
【发布时间】:2018-02-02 01:37:14
【问题描述】:

有谁知道如何抑制 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.

我将该库添加到我的 Web 应用程序(包括嵌入式 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"

【问题讨论】:

    标签: java maven-3 esapi embedded-tomcat-7


    【解决方案1】:

    我可以通过参考@avgvstvs 的回答来解决此问题以添加InitializationListener

    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
        }
    }
    

    【讨论】:

    • 补充一下马特所说的,在下一个 ESAPI 版本中(我们希望在_至少_几个月后发布,希望更快),您将能够继承 DefaultSecurityConfiguration,覆盖 (现在 'protected') logSpecial() 方法根本不记录。它不能转到记录器的原因是 1) 它不能在流中切换记录类型(选择是 JUL 或 log4j),以及 2) 它不知道首选记录器,直到它在你的 ESAPI 中找到它。属性文件。不过,您还必须使用您的子类的名称对 ESAPI.initialize() 进行额外的调用。
    • OTOH,不要轻描淡写,但大多数人只是将 stdout 和 stderr 重定向到文件 web 他们的 Java 应用程序服务器已启动,并与 Tomcat / WebSphere / WebLogic Server 等的所有内容进行比较。发送到标准输出和标准错误,这只是杯水车薪。大多数人宁愿记录太多也不愿记录不够。
    • 新的 ESAPI 版本还在路上吗?
    • 你忘了把 Err 放回去!
    • @KevinW.Wall 在我的情况下,所有内容都以 json 格式记录在控制台中并发送到集中式日志管理器。令人讨厌的是破坏部分日志的原因。
    【解决方案2】:

    你被一个先有鸡还是先有蛋的场景所困扰。这些声明来自System.out.println()System.err.println() 的组合。

    问题是我们需要加载属性文件以确定要加载的记录器,但是在初始化时……我们没有实例化记录器。

    所以我们默认使用唯一的其他选项,即控制台输出。

    过去我们已将其删除,但随后邮件列表被“我的应用程序无法启动,HEEEEELP!”所淹没

    所以他们回来了,他们不会去任何地方:功能不是错误。

    如果您决心摆脱文件搜索消息,我建议像 here. 那样重定向输出流

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

    免责声明:我是 ESAPI-java 的联合负责人之一。

    【讨论】:

    • 感谢您的建议(我投票 +1)。我可以解决这个问题(另见我的回答)。不过我觉得ESAPI的加载处理还有改进的空间。
    • 无论如何@KoheiTAMURA -- 现在这个项目只有我们两个人!我们可以使用帮助!
    • @avgvstvs 建议您采用 SLF4J 并将日志配置和初始化推迟到它。 Slf4j 对先有鸡和先有蛋的日志配置问题有一个合理的解决方案。我还建议 ESAPI 使用 DEBUG 级别来记录默认属性的使用并记录如何为客户端应用程序打开配置日志记录(即使用 DEBUG 日志记录配置的类名)。这将消除 stdout/stderr 上的所有噪音,同时实际上提高了应用程序 ESAPI 日志记录的易用性。 hth
    • @CharlieReitzel 感谢您的建议,但我们不会在 ESAPI 2.X 中触及这个。如果您希望在 3.X 之前更改它,我们在这里接受 PR:github.com/ESAPI/esapi-java-legacy 至于“但当 3.X”,可能是 2023 年第四季度。
    • @CharlieReitzel 实际上我说得太早了:属性 java -Dorg.owasp.esapi.logSpecial.discard=true 使他们沉默。我应该记得的。 ?
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多