1

どうしても、次のことは不可能ですが、本番環境の1つで発生しています。

設定

  • ESAPI 2.01
  • メインサーブレットフィルターの設定と現在のリクエストスレッドローカルオブジェクトの削除:

    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

これらのパスは両方ともサーブレットフィルターを通過します(マッピング " /*")

私が受け取ったエラーメールの1つは、エラーをpath_aスローしていることを示唆しています。これにより、エラーメールが開始され、メールコードで、現在のリクエスト(via 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 に答える