Injection de dépendances en C# : Erreurs liées à la portée et à l’utilisation de singleton qui exposent votre application

Principes de base de l'injection de dépendances en C# et risques de sécurité cachés

L'injection de dépendances en C# rend les applications modulaires, testables et maintenables. Cependant, mal configurée, elle devient une porte d'entrée cachée pour les fuites de données, l'élévation de privilèges et la défaillance de l'isolation des états. Chaque conteneur d'injection de dépendances C# gère les objets en fonction de leur durée de vie de service C#, singleton, à portée limitée ou transitoire. Lorsque les développeurs attribuent une durée de vie incorrecte, les instances peuvent persister d'une requête à l'autre, entraînant des fuites de données utilisateur ou de contexte de session.

Exemple : un service singleton contenant des données utilisateur par requête est partagé globalement, ce qui signifie que les informations d’un utilisateur peuvent apparaître dans la session d’un autre. Il ne s'agit pas simplement d'un bug ; il s'agit d'une faille de sécurité silencieuse.

Pièges de l'injection de dépendances en C# avec les services à portée limitée, singleton et transitoires

Les définitions de durée de vie de service incorrectes en C# sont des sources courantes de comportements imprévisibles, en particulier en cas de forte concurrence ou de requêtes parallèles.

Fuite d'état partagé

⚠️Exemple non sécurisé, à des fins pédagogiques uniquement. Ne pas utiliser en production.

// Insecure: UserContext stored in a Singleton service
services.AddSingleton<UserContextService>();

Dans cette configuration d'injection de dépendances en C#, chaque requête partage la même Service de contexte utilisateur Par exemple, cela signifie que des données d'une session utilisateur peuvent fuiter vers une autre.

Version sécurisée :

// Secure: Scoped service for per-request user context
services.AddScoped<UserContextService>();

Note pédagogique : Toujours limiter la portée des services qui dépendent des données de requête ou de session.

Instabilité transitoire

L'utilisation de AjouterTransitoire Pour un service lourd (comme l'accès à une base de données), cela peut créer des connexions inutiles ou une surcharge mémoire, entraînant des problèmes de fiabilité et de performance. Bien que cela ne constitue pas une vulnérabilité directe, il s'agit d'un anti-modèle d'injection de dépendances en C# qui augmente la surface d'attaque en raison d'un comportement incohérent.

Utilisation inappropriée de la portée dans les tâches en arrière-plan

⚠️Exemple non sécurisé, à des fins éducatives uniquement :

public class BackgroundWorker
{
    private readonly MyScopedService _service;
    public BackgroundWorker(MyScopedService service)
    {
        _service = service; // Scoped service injected into Singleton
    }
}
To fix this issue, create a new service scope inside the background task instead of injecting a scoped service directly into a singleton.

Version sécurisée : Créer une nouvelle étendue pour les services à étendue

public class BackgroundWorker : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;

    public BackgroundWorker(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using (var scope = _scopeFactory.CreateScope())
            {
                var scopedService = scope.ServiceProvider.GetRequiredService<MyScopedService>();
                await scopedService.DoWorkAsync();
            }

            await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
        }
    }
}

Note pédagogique : L’injection d’une dépendance à portée limitée dans un singleton provoque des exceptions d’exécution, voire une exposition de données entre requêtes lorsqu’elle est forcée via des modèles de fabrique non sécurisés.

Durée de vie du service : erreurs de configuration C# dans le monde réel CI/CD Les scénarios

Les erreurs de configuration dans le cycle de vie des services C# ne se limitent pas aux compilations locales ; elles se propagent souvent silencieusement à travers les services. CI/CD pipelines. Différents environnements (par exemple, développement local vs production cloud) peuvent modifier la durée de vie des injections de dépendances C# en fonction de paramètres spécifiques à l'environnement. Exemple : configuration d'environnement non sécurisée.

⚠️# Insécurité CI/CD pipeline (ici)

- name: Configure services
  run: dotnet run --env Production --useSingletons true
# Never expose real tokens, credentials, or internal URLs in pipelines

Si une étape de test utilise AjouterScoped() mais la production pipeline les forces AjouterSingleton(), les données sensibles (comme les revendications ou les jetons des utilisateurs) peuvent persister au-delà de leur cycle de vie prévu.

Version sécurisée :

- name: Enforce consistent service lifetimes
  run: dotnet test --filter "Category=DIValidation"

Note pédagogique : Validez les configurations DI pour chaque environnement.

En intégrant les vérifications de durée de vie dans pipelineLes équipes veillent à ce que le comportement de l'injection de dépendances en C# reste cohérent dans tous les environnements.

Prévention des failles de sécurité dans la configuration d'injection de dépendances en C#

Les développeurs doivent considérer les cycles de vie de l'injection de dépendances en C# comme faisant partie intégrante du modèle de sécurité, et non comme un simple élément d'architecture. Une configuration incorrecte de la durée de vie des services en C# peut entraîner une confusion des privilèges ou la persistance de données entre des sessions non liées.

Liste de contrôle de sécurité DI

  • Utilisez le AjouterScoped() pour les services liés aux requêtes HTTP ou aux données utilisateur.
  • Utilisez le AjouterSingleton() uniquement pour les services sans état et thread-safe.
  • Utilisez le AjouterTransitoire() pour les objets légers et éphémères.
  • Vérifier la cohérence de l'enregistrement des services dans tous les environnements.
  • Évitez d'injecter des services à portée limitée dans des singletons.
  • Mettez en œuvre une validation du constructeur pour éviter les dépendances nulles ou non sécurisées.
  • Examinez régulièrement la configuration d'injection de dépendances en C# lors des revues de code.

Exemple de validation DI sécurisée

var provider = services.BuildServiceProvider(new ServiceProviderOptions
{
    ValidateScopes = true,
    ValidateOnBuild = true
});

Note pédagogique : Activez la validation à l’exécution pour détecter rapidement les durées de vie mal configurées.

Un enregistrement DI incorrect n'est pas seulement un défaut de conception ; c'est une faille de sécurité qui peut exposer des références mémoire ou de données entre utilisateurs.

Automatisation de la validation du cycle de vie des services en C# dans le cadre du DevSecOps Pipelines

In Flux de travail DevSecOps, automatisation est la clé pour maintenir des durées de vie cohérentes pour l'injection de dépendances en C#. Les vérifications manuelles sont sujettes aux erreurs ; validation automatisée garantit que les erreurs de configuration sont détectées avant le déploiement. Exemple pipeline l'intégration:

- name: Run DI validation tests
  run: |
    dotnet test --filter Category=DependencyInjection
    xygeni validate --rules service-lifetime
# Never expose real tokens, credentials or internal URLs in pipelines

Intégrer la validation dans CI/CD garantit que les configurations d'injection de dépendances C# respectent les règles de durée de vie attendue des services C#, bloquant automatiquement les déploiements non sécurisés.

Détection des schémas d'injection de dépendances C# non sécurisés avec Xygeni

Xygéni Code Security détecte et applique automatiquement les politiques de sécurité pour les configurations d'injection de dépendances (DI) C# non sécurisées dans les référentiels, les services et pipelines. Au lieu de se contenter d'identifier les erreurs de configuration, il se connecte directement à votre système. CI/CD Des processus permettant de bloquer les déploiements non sécurisés avant leur mise en production.

Xygéni détecte :

  • Les services à portée limitée sont injectés dans des singletons.
  • Configurations de durée de vie des services incohérentes entre les environnements.
  • Dépendances circulaires au sein des graphes de services.
  • Manquant Valider les portées or Valider à la compilation options.
  • Propagation des privilèges via des instances de service partagées ou réutilisées.

Exemple de commande :

xygeni scan --detect dependency-injection

En corrélant les configurations DI avec les métadonnées de déploiement, Xygeni valide la cohérence du cycle de vie et empêche les flux de données interservices non sécurisés. Il garantit que chaque configuration d'injection de dépendances C# est conforme à l'architecture et à la politique de sécurité. standards définies par votre organisation.

Comment s'intègre-t-il ?

Xygeni détecte les erreurs de configuration de l'injection de dépendances C#, telles que des portées incorrectes ou des dépendances circulaires, et applique automatiquement les règles de sécurité. CI/CD exécution. En cas de violation, Xygeni bloque la compilation, signale la cause première et propose une solution guidée.

Note pédagogique : Activer l'application de Xygeni dans CI/CD pipelines pour transformer la validation DI en un contrôle continu et automatisé, garantissant une configuration de service cohérente et sécurisée dans tous les environnements.

L'injection de dépendances sécurisée commence par la discipline du cycle de vie.

L'injection de dépendances en C# offre aux développeurs flexibilité et une architecture plus propre, mais elle introduit également des risques lorsque la durée de vie des services n'est pas correctement gérée. Une mauvaise utilisation des services à portée limitée ou des services singleton peut entraîner une élévation de privilèges, une exposition des données ou un partage d'état inattendu entre les requêtes.

Comprendre et valider les limites de durée de vie des services C# est essentiel pour maintenir la sécurité et la cohérence. En automatisant les vérifications de durée de vie En validant en continu les configurations d'injection de dépendances, les équipes préviennent les erreurs de logique cachées avant qu'elles n'atteignent la production.

Des outils comme Xygeni Code Security Simplifiez ce processus en corrélant les étendues de service avec les métadonnées de déploiement et en détectant les violations au plus tôt, transformant ainsi cette validation en un processus automatisé. CI/CD un contrôle qui garantit des pratiques d'injection de dépendances cohérentes et sécurisées dans tous les environnements.

sca-tools-logiciel-outils-d'analyse-de-composition
Priorisez, corrigez et sécurisez vos risques logiciels
Essai gratuit 7 jours
Pas de carte bleue requise

Sécurisez le développement et la livraison de vos logiciels

avec la suite de produits Xygeni