diff --git a/app/auth/auth_middleware.go b/app/auth/auth_middleware.go index e2c6a53..4af8bfe 100644 --- a/app/auth/auth_middleware.go +++ b/app/auth/auth_middleware.go @@ -163,9 +163,14 @@ func verifyHeaderSigV4(r *http.Request, t *tenant.Tenant, authHeader string) err if err != nil { return err } + actualHash := sha256Hex(body) payloadHash := r.Header.Get("X-Amz-Content-Sha256") if payloadHash == "" { - payloadHash = sha256Hex(body) + payloadHash = actualHash + } else if !strings.EqualFold(payloadHash, actualHash) && !strings.EqualFold(payloadHash, "UNSIGNED-PAYLOAD") { + // Заголовок заявлен, но не совпадает с фактическим хэшем тела: клиент + // не должен иметь возможность подменить тело под подписанным заголовком. + return errors.New("X-Amz-Content-Sha256 does not match body hash") } canonicalRequest, err := buildCanonicalRequest(r, signedHeaders, payloadHash, true)