3

私のプロジェクトは開発サーバーで作業しています。次の両方の場合に機能します。

  1. ソース パスに .esapi ディレクトリがあるため、最終的に WEB-INF/classes になります。
  2. lib ルートに .esapi ディレクトリがあるため、最終的に WEB-INF/lib になります。

ただし、(上記の 2 つの戦略のいずれかを使用して) Google にデプロイすると機能しません。

ESAPI が見つからないという通常のメッセージが表示されます。Google にデプロイされた ESAPI を初めて使用しようとしたときのプロパティ ファイル。

Attempting to load ESAPI.properties via file I/O.
Attempting to load ESAPI.properties as resource file via file I/O.
Not found in 'org.owasp.esapi.resources' directory or file not readable: /base/data/home/ap
Not found in SystemResource Directory/resourceDirectory: .esapi/ESAPI.properties
Loading ESAPI.properties via file I/O failed. Exception was: java.io.FileNotFoundException
Attempting to load ESAPI.properties via the classpath.
ESAPI.properties could not be loaded by any means. Fail. Exception was: java.security.Acces

ESAPI には、AppEngine をサポートするための変更が含まれているようですhttp://goo.gl/rD8dz

更新 問題は、org.owasp.esapi.reference.DefaultSecurityConfiguration の 603 行目で、Google Appengine では違法な ClassLoader.getSystemClassLoader() を呼び出すことです。これにより、上記の例外が発生します (トリミングされて申し訳ありません)。コードがリソースを取得しようとする前に、3 つの ClassLoader が配列に読み込まれます。

    ClassLoader[] loaders = new ClassLoader[] {
            Thread.currentThread().getContextClassLoader(),
            ClassLoader.getSystemClassLoader(),
            getClass().getClassLoader() 
    };
    String[] classLoaderNames = {
            "current thread context class loader",
            "system class loader",
            "class loader for DefaultSecurityConfiguration class"
    };

LoadConfigurationFromClasspath メソッドから SystemClassLoader (および対応する classLoaderName) を削除した DefaultSecurityConfiguration の独自のコピーをハッキングしました。

    ClassLoader[] loaders = new ClassLoader[] {
            Thread.currentThread().getContextClassLoader(),
            getClass().getClassLoader() 
    };
    String[] classLoaderNames = {
            "current thread context class loader",
            "class loader for DefaultSecurityConfiguration class"
    };

皮肉なことに、このアプローチが失敗するのは、クラスローダーをループすることでコードを読みやすく/拡張しやすくしたためです (IMHO)。getSystemClassLoader の呼び出しを遅らせる内部クラスを含むパッチを提出したくなります (これは AppEngine では実行できません)。

esapi jar が密閉されていないためにのみ可能であるため、これが機能するのは興味深いことです。セキュリティ ライブラリ jar を封印する必要があると考えていました。多分私は間違ったものを使用しています!

更新 Maven経由でesapi jarを使用していますが、これは再パッケージ化されており、署名されていません。理想的ではありませんが、Maven から入手した他の 40 個のオープン ソース jar と同じくらい安全です。

4

5 に答える 5

3

独自の実装で DefaultSecurityConfiguration クラスをオーバーライドするソリューションは、問題に対処するための正確な方法です。これがまさにこのように設計されている理由です。主に暗号化/ハッシュに関して、Google App-Engine で ESAPI を使用することには、他にもいくつか固有の問題があります。この問題は、このスレッド (http://code.google.com/p/googleappengine/issues/detail?id=1612) のコメントに従って「部分的に」解決されましたが、GAE での暗号化の使用にはまだ深刻な制限があります。

于 2012-03-07T23:59:21.710 に答える
3

Google App Engine プロジェクトにESAPI 2.1.0を正常に統合しましたが、Maven も使用しませんでした。

ESAPI.propertiesvalidation.propertiesをディレクトリに配置ます。したがって、ESAPI.propertiesのフル パスは次のようになります。[gae-project]/war/ESAPI/

[gae-project]/war/ESAPI/ESAPI.properties

戦争下に置くことで、ファイルが確実に Google にアップロードされます。

appengine-web.xmlを編集し、<appengine-web-app>ルート ノード内に次の行を追加します。

...
<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    <property name="org.owasp.esapi.resources" value="ESAPI" />
</system-properties>
<static-files>
    <exclude path="/ESAPI**properties" />
</static-files>
...

これにより、App Engine が.propertiesファイルをプロジェクト ファイルとして認識できるようになります。

より詳細な議論については、ESAPI for Google App Engine Integration Tutorialも読むことができます。

于 2014-01-09T07:40:59.747 に答える
1

次のように、ファイルをMETA-INF/ディレクトリに配置してから、org.owasp.esapi.resourcesシステム プロパティをMETA-INF/appengine -web.xmlに変更できます。

    <system-properties>
      <property name="org.owasp.esapi.resources" value="META-INF/" />
    </system-properties>

DefaultSecurityConfiguration構成ファイルを最初にリソース ディレクトリで検索し、次にクラスパスで検索するためです。

于 2013-06-05T15:36:57.853 に答える
0

このプロジェクトでは、ファイルは WEB-INF/classes フォルダーにあります。.esapi サブフォルダーは使用しません。

Esapi バージョン = 2.0.1

ただし、jboss にデプロイされています。

于 2012-02-21T20:19:16.557 に答える