ESAPI - 获取具有禁止依赖项的 NoClassDefFoundError (LoggerFactory)
ESAPI - Getting NoClassDefFoundError (LoggerFactory) with banned dependency
我正在使用 espaiESAPI 对字符串值进行编码以解决跨站点脚本问题,如下所示(代码片段)。
String encodedString = ESAPI.encoder().encodeForHTML(value);
异常跟踪
org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder) CTOR threw exception.
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129)
at org.owasp.esapi.ESAPI.encoder(ESAPI.java:99)
<bold>Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/spi/LoggerFactory</bold>
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:74)
at org.owasp.esapi.ESAPI.logFactory(ESAPI.java:137)
at org.owasp.esapi.ESAPI.getLogger(ESAPI.java:154)
at org.owasp.esapi.reference.DefaultEncoder.<init>(DefaultEncoder.java:75)
at org.owasp.esapi.reference.DefaultEncoder.getInstance(DefaultEncoder.java:59)
... 71 more
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.spi.LoggerFactory
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
Maven 存储库pom.xml
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>${org.owasp.esapi.version}</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
<exclusion>
<groupId>xercesImpl</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
<exclusion>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
</exclusion>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
<exclusion>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
如果我不排除 log4j 那么它将抛出依赖收敛错误,因为 log4j 在 maven banned 依赖中声明如下所示
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<requireJavaVersion>
<version>${java.version}</version>
</requireJavaVersion>
<requireMavenVersion>
<version>3.0</version>
</requireMavenVersion>
<DependencyConvergence />
<bannedDependencies>
<excludes>
<!-- This should not exist as it will force SLF4J calls to be
delegated to log4j -->
<exclude>org.slf4j:slf4j-log4j12</exclude>
<!-- This should not exist as it will force SLF4J calls to be
delegated to jul -->
<exclude>org.slf4j:slf4j-jdk14</exclude>
<!-- Ensure only the slf4j binding for logback is on the classpath -->
<exclude>log4j:log4j</exclude>
<!-- As recommended from the slf4j guide, exclude commons-logging -->
<exclude>commons-logging:commons-logging</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
在这方面的帮助将不胜感激。如果您需要更多详细信息,请告诉我。提前致谢!
ESAPI 不支持 SLF4J,尽管后者支持 log4j。您的 ESAPI 日志记录选择是 log4j 或 java.util.logging,通过 ESAPI.properties 中的 ESAPI.logger 属性 控制。如果您决定使用 log4j(即 ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory),那么您需要在类路径中使用 log4j.jar 和 log4j.xml 或 log4j.properties ,具体取决于您使用的 log4j 版本。或者,您可以通过在 ESAPI.properties 文件中设置 ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory 来使用 java.util.logging。
我看到你似乎是在为富国银行做这件事。如果您还有其他问题,请在 Teamworks 中查找 "Kevin W. Wall" 并给我发送电子邮件,因为我是那里的安全代码审查团队的一员,也是 ESAPI 的项目负责人,所以如果有更多的上下文,我可能会提出建议其他可能性。
-凯文
只是一个更新:添加了对 SLF4J 的支持,所以如果您使用的是 ESAPI 版本 2.2.0.0,您可以通过将 ESAPI.Logger
属性 设置为值 [=11] 来使用它=]
我升级到最新版本 2.2.1.1
并且我需要在 ESAPI.properties
中添加两个额外的属性(除了 @Carlo 指出的那个):
ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
Logger.UserInfo=false
Logger.ClientInfo=false
如果您的 SpringBoot 项目没有 ESAPI.properties,则在 src/main/resource 文件夹中添加名为 ESAPI.properties 的文件,并向其中添加以下行。
ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
ESAPI.LogEncodingRequired=false
同时检查maven引用库和esapi版本,应该是esapi-2.2.0.0或esapi-2.2.1.1(基本上你应该使用这些esapi版本)
注意:您可以根据在 运行 应用程序时收到的错误添加更多属性。
我正在使用 espaiESAPI 对字符串值进行编码以解决跨站点脚本问题,如下所示(代码片段)。
String encodedString = ESAPI.encoder().encodeForHTML(value);
异常跟踪
org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder) CTOR threw exception.
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129)
at org.owasp.esapi.ESAPI.encoder(ESAPI.java:99)
<bold>Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/spi/LoggerFactory</bold>
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:74)
at org.owasp.esapi.ESAPI.logFactory(ESAPI.java:137)
at org.owasp.esapi.ESAPI.getLogger(ESAPI.java:154)
at org.owasp.esapi.reference.DefaultEncoder.<init>(DefaultEncoder.java:75)
at org.owasp.esapi.reference.DefaultEncoder.getInstance(DefaultEncoder.java:59)
... 71 more
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.spi.LoggerFactory
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
Maven 存储库pom.xml
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>${org.owasp.esapi.version}</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
<exclusion>
<groupId>xercesImpl</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
<exclusion>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
</exclusion>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
<exclusion>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
如果我不排除 log4j 那么它将抛出依赖收敛错误,因为 log4j 在 maven banned 依赖中声明如下所示
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<requireJavaVersion>
<version>${java.version}</version>
</requireJavaVersion>
<requireMavenVersion>
<version>3.0</version>
</requireMavenVersion>
<DependencyConvergence />
<bannedDependencies>
<excludes>
<!-- This should not exist as it will force SLF4J calls to be
delegated to log4j -->
<exclude>org.slf4j:slf4j-log4j12</exclude>
<!-- This should not exist as it will force SLF4J calls to be
delegated to jul -->
<exclude>org.slf4j:slf4j-jdk14</exclude>
<!-- Ensure only the slf4j binding for logback is on the classpath -->
<exclude>log4j:log4j</exclude>
<!-- As recommended from the slf4j guide, exclude commons-logging -->
<exclude>commons-logging:commons-logging</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
在这方面的帮助将不胜感激。如果您需要更多详细信息,请告诉我。提前致谢!
ESAPI 不支持 SLF4J,尽管后者支持 log4j。您的 ESAPI 日志记录选择是 log4j 或 java.util.logging,通过 ESAPI.properties 中的 ESAPI.logger 属性 控制。如果您决定使用 log4j(即 ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory),那么您需要在类路径中使用 log4j.jar 和 log4j.xml 或 log4j.properties ,具体取决于您使用的 log4j 版本。或者,您可以通过在 ESAPI.properties 文件中设置 ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory 来使用 java.util.logging。
我看到你似乎是在为富国银行做这件事。如果您还有其他问题,请在 Teamworks 中查找 "Kevin W. Wall" 并给我发送电子邮件,因为我是那里的安全代码审查团队的一员,也是 ESAPI 的项目负责人,所以如果有更多的上下文,我可能会提出建议其他可能性。
-凯文
只是一个更新:添加了对 SLF4J 的支持,所以如果您使用的是 ESAPI 版本 2.2.0.0,您可以通过将 ESAPI.Logger
属性 设置为值 [=11] 来使用它=]
我升级到最新版本 2.2.1.1
并且我需要在 ESAPI.properties
中添加两个额外的属性(除了 @Carlo 指出的那个):
ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
Logger.UserInfo=false
Logger.ClientInfo=false
如果您的 SpringBoot 项目没有 ESAPI.properties,则在 src/main/resource 文件夹中添加名为 ESAPI.properties 的文件,并向其中添加以下行。
ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
ESAPI.LogEncodingRequired=false
同时检查maven引用库和esapi版本,应该是esapi-2.2.0.0或esapi-2.2.1.1(基本上你应该使用这些esapi版本)
注意:您可以根据在 运行 应用程序时收到的错误添加更多属性。