ESAPI - 使用被禁用的依赖项时出现NoClassDefFoundError(LoggerFactory)

12

我正在使用 ESAPI对字符串值进行编码,以解决跨站脚本攻击问题,如下所示(代码片段)。

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 禁止使用的依赖项中被声明如下:

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

希望能得到相关的帮助,如果需要更多细节,请告知。谢谢!

4个回答

19

我升级到最新版本2.2.1.1,需要在ESAPI.properties文件中添加两个附加属性(除了@Carlo指出的一个属性):

ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
Logger.UserInfo=false
Logger.ClientInfo=false

虽然在我的情况下我们使用的是Log4j2,但它还是有所帮助的。我不得不使用org.owasp.esapi.logging.log4j.Log4JLogFactory,该工厂已从org.owasp.esapi.reference.Log4JLogFactory移动到此包中。 - Dmitriy Popov

16

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”并给我发送电子邮件,因为我也是Secure Code Review团队以及ESAPI项目的负责人,所以在提供更多上下文的情况下,我可能会建议其他可能性。

-kevin


1
谢谢Kevin,现在它可以工作了。我改变了ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory。 - Dinesh M
2
这已经不再正确了。请参考@Carlo的回答。 - royka

13

最新消息:已加入对SLF4J的支持。如果您正在使用ESAPI 2.2.0.0版本,则可以通过将ESAPI.Logger属性设置为值org.owasp.esapi.logging.slf4j.Slf4JLogFactory来使用它。


4

如果您的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版本)。

注意:您可以根据运行应用程序时遇到的错误添加更多属性。


如果您有关于如何将简单的Spring Boot与ESAPI集成的参考资料,我会非常感激您的帮助。我有些迷失了。 - Einstein_AB
一天内会给出一些指针。 - MonishGhutke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接