1

无论如何,我知道以下是不可能的,但它发生在我们的一个生产环境中:

设置

  • ESAPI 2.01
  • 主 servlet 过滤器设置和删除当前请求线程本地对象:

    try {
        ESAPI.httpUtilities().setCurrentHTTP(request, response);
    
        // filter logic ...
    } catch (Exception e) {
        LOG.error(Logger.SECURITY_FAILURE, "Error in ESAPI "
                + "security filter: " + e.getMessage(), e);
        request.setAttribute("message", e.getMessage());
    } finally {
        ESAPI.clearCurrent();
    }
    

所有请求都通过此过滤器,并ESAPI.currentRequest()在整个系统中使用。

  • 路径 A ( http://server/path_a/)
    • 一直到它到达method_a,这个方法不能从path_b
  • 路径 B ( http://server/path_b)
    • 一直到它到达method_b,无法从path_a

这两条路径都经过 servlet 过滤器(映射“ /*”)

我收到的其中一封错误邮件表明path_a正在引发错误,这反过来又会启动错误邮件,在邮件代码中,当前请求(通过ESAPI.currentRequest())被枚举为请求信息。

问题

在错误邮件中,来自的请求信息与来自path_a的堆栈跟踪信息相关method_b,对我来说这似乎是不可能的,因为两者都在单独的线程中运行。

问题

这怎么可能?我无法在本地重新创建它,除了设置和清除之外,我还必须采取某些预防措施ThreadLocal吗?这可能是tomcat设置的问题吗?我迷路了。


PS:问题中的代码已被简化,因为例如代码库太大


错误邮件

4

1 回答 1

2

阅读 ESAPI 代码https://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java有一些关于线程本地。

我要说的最大问题是它使用InheritableThreadLocal. 如果线程 A 派生了一个线程 B,B 将继承 A 的线程局部值;但是,当 A 然后清除本地线程时,它不会影响 B,因此 B 的继承值将保留。ESAPI 可能不应该使用InheritableThreadLocal.

如果不了解有关应用程序中线程的更多信息,我不能说这会如何产生您看到的问题。

于 2013-02-07T07:44:54.290 回答