ProgrammatieDevOps-engineer

Beschrijf het mechanisme van automatische laadvariabelen voor omgevingen (%ENV) in Perl. Hoe interageert Perl met omgevingsvariabelen en welke potentiële kwetsbaarheden bestaan er bij het werken met %ENV?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl bevat de globale associatieve array %ENV de huidige omgevingsvariabelen van het proces. Elke manipulatie van deze hash heeft directe invloed op de omgeving van het proces en daarmee op de kindprocessen die worden aangemaakt via system, exec, open, enzovoort.

Voorbeeld van gebruik:

print $ENV{"HOME"}; # Verkrijg het pad naar de home directory van de gebruiker $ENV{"PATH"} = "/usr/bin"; # Schrijf de PATH-variabele opnieuw

Fijnere details:

  • Elke wijziging in %ENV beïnvloedt onmiddellijk alle toekomstige shell-opdrachten die vanuit dit Perl-proces worden uitgevoerd.
  • Toewijzing van undef of het verwijderen van een element verwijdert de overeenkomstige omgevingsvariabele.
  • Voor gegarandeerde veiligheid, gebruik gebruikersinvoer niet rechtstreeks in %ENV, vooral niet in CGI- of systeemscripts.
  • Niet alle variabelen bestaan op alle systemen. Controleer op de aanwezigheid van de sleutel via exists $ENV{"VAR"}.

Misleidende vraag

Verwijdert de operatie $ENV{"MYVAR"} = undef de omgevingsvariabele?

Antwoord: Nee! Dit wijst gewoon de variabele de waarde undef toe, maar de sleutel blijft in de hash! Om een omgevingsvariabele te verwijderen, gebruik delete $ENV{"MYVAR"}.

# VERWIJDERT de variabele NIET uit de omgeving $ENV{"FOO"} = undef; # Correct — verwijdert delete $ENV{"FOO"};

Voorbeelden van echte fouten door gebrek aan kennis van de subtiliteiten van het onderwerp


Verhaal

Op de webserver, bij het opschonen van de omgeving voor veiligheid, wees de programmeur undef toe in plaats van variabelen te verwijderen. De variabelen verdwenen niet en konden door aanvallers worden gebruikt, waardoor een kwetsbaarheid voor het uitvoeren van opdrachten met gevaarlijke paden in PATH ontstond.


Verhaal

Bij het doorgeven van omgevingsvariabelen aan subprocessen vergaten ze oude variabelen te verwijderen, wat onverwachte fouten in uitvoerende externe Hulpprogramma's en ongewenst gedrag van het programma veroorzaakte.


Verhaal

Proberend de hele omgeving voor een kindproces op te schonen, deed het script gewoon %ENV = ();, maar zonder vooraf de benodigde variabelen te controleren. Dit leidde tot crashes, omdat een aantal services verplichte omgevingssleutels vereist (zoals USER of localisatievariabelen).