0

RESTful Web サービスで Amazon S3 認証を機能させようとしているときに、テストを行ったところ、S3 認証の Verifier にバグの可能性があることがわかりました。サーバー シークレットに存在しないアクセス キーを指定すると、AwsVerifier は NullPointerException をスローし、HTTP 500 内部サーバー エラーが発生します。問題は、AwsVerifier.java の 233 行目から始まります。

char[] userSecret = getLocalSecret(userId);

userId がローカル シークレットに存在しない場合 (つまり、サーバー シークレット マップに存在しないアクセス キー)、関連するシークレットがないため、userSecret は null になります。AwsVerifier が 235 行目で getS3Signature() を呼び出す場合:

String sigToCompare = AwsUtils.getS3Signature(request, userSecret);

NullPointerException が発生します。これは私にはバグのように思えます...誰か同意/同意しませんか?

4

1 に答える 1

0

これはバグだと思います。ただし、これを回避する方法を見つけました。AwsVerifier をサブクラス化し、verify() メソッドをオーバーライドするだけです。コードをスーパークラスの verify() からサブクラスにコピーしてください。ただし、次のように変更してください。

public class NewAwsVerifier extends AwsVerifier {
    public NewAwsVerifier(LocalVerifier wrappedVerifier) {
        super(wrappedVerifier);
    }
    ...
    @Override
    public int verify(Request request, Response response) {
    ...
        char[] userSecret = getLocalSecret(userId);
        if (userSecret == null) {
            // If there is no userSecret for the given userId then the
            // request probably specified a user that doesn't exist
            // and using that userID in the getS3Signature call
            // will result in a NullPointerException, so we intercept it here
            return RESULT_INVALID;
        }
        char[] signature = getSecret(request, response);
        String sigToCompare = AwsUtils.getS3Signature(request, userSecret);
    ...
    }
}

次に、この新しい Verifier を必ず使用してください。

MapVerifier verifier = new MapVerifier();
NewAwsVerifier newVerifier = new NewAwsVerifier(verifier);

// Get passwords from a more secure source (only here for illustration)!
verifier.getLocalSecrets().put("accessKey", "secretKey".toCharArray());
auth.setVerifier(newVerifier);

サーバー シークレットに存在しないアクセス キーを指定すると、HTTP 500 内部サーバー エラーを受け取る代わりに、適切にアクセスが拒否されます。

于 2013-08-19T15:33:02.900 に答える