C#-avhengighetsinjeksjon: Scoped vs. Singleton-feil som eksponerer appen din

Grunnleggende om C#-avhengighetsinjeksjon og skjulte sikkerhetsrisikoer

C#-avhengighetsinjeksjon gjør applikasjoner modulære, testbare og vedlikeholdbare. Men når de konfigureres feil, blir de et skjult inngangspunkt for datalekkasjer, privilegiumsøkning og ødelagt tilstandsisolasjon. Hver C#-container for avhengighetsinjeksjon administrerer objekter etter deres tjenestelevetid i C#, singleton, scoped eller transient. Når utviklere tildeler feil levetid, kan forekomster vedvare på tvers av forespørsler, noe som kan føre til lekkasje av brukerdata eller øktkontekst.

Eksempel: en singleton-tjeneste som lagrer brukerdata per forespørsel deles globalt, noe som betyr at én brukers informasjon kan vises i en annens økt. Dette er ikke bare en feil; det er en stille sikkerhetssårbarhet.

Fallgruver i C# for avhengighetsinjeksjon med Scoped-, Singleton- og Transient-tjenester

Feil C#-definisjoner for tjenestelevetid er vanlige kilder til uforutsigbar oppførsel, spesielt under høy samtidighets- eller parallellforespørsler.

Delt tilstandslekkasje

⚠️Usikkert eksempel, kun for pedagogiske formål. Ikke bruk i produksjon.

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


				
			

I dette C#-oppsettet for avhengighetsinjeksjon deler hver forespørsel det samme Brukerkonteksttjeneste for eksempel, noe som betyr at data fra én brukerøkt kan lekke inn i en annen.

Sikker versjon:

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

				
			

Opplæringsmerknad: Bruk alltid omfanget av tjenester som er avhengige av forespørsels- eller øktdata.

Forbigående ustabilitet

Ved hjelp av Legg til forbigående for en tung tjeneste (som databasetilgang) kan det skape unødvendige tilkoblinger eller minneoverhead, noe som fører til problemer med pålitelighet og ytelse. Selv om dette ikke er en direkte sårbarhet, er det et C#-antimønster for avhengighetsinjeksjon som øker angrepsoverflaten gjennom inkonsekvent oppførsel.

Feil bruk av omfang i bakgrunnsoppgaver

⚠️Usikkert eksempel, kun for pedagogiske formål:

				
					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.


				
			

Sikker versjon: Opprett et nytt omfang for omfangstjenester

				
					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);
        }
    }
}

				
			

Pedagogisk merknad: Injeksjon av en omfangsavhengighet i en singleton forårsaker kjøretidsunntak, eller enda verre, dataeksponering på tvers av forespørsler når den tvinges gjennom usikre fabrikkmønstre.

Feilkonfigurasjoner i C# i tjenestens levetid i Real CI/CD scenarier

Feilkonfigurasjoner i tjenestelevetidens C# er ikke begrenset til lokale bygg; de forplanter seg ofte stille gjennom CI/CD pipelines. Ulike miljøer (f.eks. lokal utvikling kontra skyproduksjon) kan overstyre levetiden for C#-avhengighetsinjeksjon med miljøspesifikke innstillinger. Eksempel: oppsett av usikkert miljø.

⚠️# Usikker CI/CD pipeline eksempel

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

				
			

Hvis en testfase bruker Legg tilScoped() men produksjonen pipeline krefter Legg tilSingleton(), sensitiv tilstand (som brukerkrav eller tokener) kan vedvare utover den tiltenkte livssyklusen.

Sikker versjon:

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

				
			

Opplæringsmerknad: Valider DI-konfigurasjoner per miljø.

Ved å integrere livstidskontroller i pipelines, team sørger for at C#-virkemåten ved avhengighetsinjeksjon forblir konsistent på tvers av miljøer.

Forebygging av sikkerhetsfeil i konfigurasjon av C#-avhengighetsinjeksjon

Utviklere må behandle livssykluser for C#-avhengighetsinjeksjon som en del av sikkerhetsmodellen, ikke bare arkitekturen. Feil oppsett av C#-tjenestelevetid kan føre til forvirring av rettigheter eller datapersistens mellom urelaterte økter.

Sjekkliste for sikker DI

  • Bruk Legg tilScoped() for tjenester knyttet til HTTP-forespørsler eller brukerdata.
  • Bruk Legg tilSingleton() kun for statsløse, trådsikre tjenester.
  • Bruk Legg til forbigående() for lette, kortlivede gjenstander.
  • Valider konsistens av tjenesteregistrering på tvers av alle miljøer.
  • Unngå å injisere scoped-tjenester i singletoner.
  • Implementer konstruktørvalidering for å unngå null- eller usikre avhengigheter.
  • Gjennomgå regelmessig C#-konfigurasjonen for avhengighetsinjeksjon under kodegjennomganger.

Eksempel på sikker DI-validering

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

				
			

Opplæringsmerknad: Aktiver kjøretidsvalidering for å oppdage feilkonfigurerte levetider tidlig.

Feil DI-registrering er ikke bare en designfeil; det er et sikkerhetshull som kan eksponere minne- eller datareferanser mellom brukere.

Automatisering av C#-validering av tjenestens levetid i DevSecOps Pipelines

In DevSecOps-arbeidsflyter og automatisering er nøkkelen til å opprettholde konsistente levetider for C#-avhengighetsinjeksjoner. Manuelle kontroller er utsatt for feil; automatisert validering sørger for at feilkonfigurasjoner fanges opp før distribusjon. Eksempel pipeline integrering:

				
					- 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


				
			

Integrering av validering i CI/CD sørger for at C#-konfigurasjoner for avhengighetsinjeksjon overholder forventede C#-regler for tjenestelevetid, og blokkerer usikre distribusjoner automatisk.

Oppdage usikre C#-avhengighetsinjeksjonsmønstre med Xygeni

Xygeni Code Security oppdager og håndhever automatisk sikkerhetspolicyer for usikre C# Dependency Injection (DI)-konfigurasjoner på tvers av repositorier, tjenester og pipelines. I stedet for bare å identifisere feilkonfigurasjoner, kobles den direkte til din CI/CD arbeidsflyter for å blokkere usikre distribusjoner før de når produksjon.

Xygeni oppdager:

  • Scoped-tjenester injiseres i singletoner.
  • Inkonsekvente konfigurasjoner for tjenestelevetid mellom miljøer.
  • Sirkulære avhengigheter innenfor tjenestegrafer.
  • Manglende ValiderOmfang or Valider ved bygging alternativer.
  • Rettighetsformidling gjennom delte eller gjenbrukte tjenesteinstanser.

Eksempelkommando:

				
					xygeni scan --detect dependency-injection
				
			

Ved å korrelere DI-konfigurasjoner med distribusjonsmetadata, validerer Xygeni livssykluskonsistens og forhindrer usikker dataflyt på tvers av tjenester. Det sikrer at alle oppsett for C#-avhengighetsinjeksjon er i samsvar med sikker arkitektur og policy. standarddefinert av organisasjonen din.

Hvordan integreres det?

Xygeni oppdager feilkonfigurasjoner i C#-avhengighetsinjeksjon, som feil omfang eller sirkulære avhengigheter, og håndhever sikkerhetsregler automatisk under CI/CD henrettelse. Når det oppstår brudd, blokkerer Xygeni byggingen, rapporterer den underliggende årsaken og tilbyr veiledet utbedring.

Pedagogisk merknad: Aktiver Xygeni-håndhevelse i CI/CD pipelines for å transformere DI-validering til en kontinuerlig, automatisert kontroll, som garanterer konsistent og sikker tjenestekonfigurasjon på tvers av miljøer.

Sikker avhengighetsinjeksjon starter med livssyklusdisiplin

C#-avhengighetsinjeksjon gir utviklere fleksibilitet og renere arkitektur, men det introduserer også risikoer når tjenestelevetider ikke administreres riktig. Misbruk av scoped- eller singleton-tjenester kan føre til privilegieeskalering, dataeksponering eller uventet tilstandsdeling på tvers av forespørsler.

Det er viktig å forstå og validere grenser for C#-tjenestelevetid for å opprettholde sikkerhet og konsistens. Ved å automatisere levetidssjekker og ved kontinuerlig validering av DI-konfigurasjoner, forhindrer teamene skjulte logiske feil før de når produksjon.

Verktøy som Xygeni Code Security forenkle denne prosessen ved å korrelere tjenesteomfang med distribusjonsmetadata og oppdage brudd tidlig, slik at valideringen blir automatisert. CI/CD kontroll som håndhever konsistente og sikre praksiser for avhengighetsinjeksjon på tvers av alle miljøer.

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken