Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 82e9b13

Browse files
Merge branch '6.4' into 7.4
* 6.4: [Scheduler] Make debug:scheduler test independent of terminal width [Messenger] Fix ErrorDetailsStampTest after dropping trace args from normalization [Scheduler] Use stored checkpoint as base date for debug:scheduler [Messenger] Drop trace args from FlattenException normalization [HttpKernel] Use backend-handled request for terminate listeners in HttpCache [WebProfilerBundle] Don’t try to access `RawMessage::$headers` [Security] Clarify AbstractToken's role-name decoupling and simplify ContextListener [Dotenv] Don't truncate OS env vars containing $ when $_ENV is unpopulated
2 parents ba757a8 + e25b004 commit 82e9b13

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

Dotenv.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,11 @@ private function doLoad(bool $overrideExistingVars, array $paths): void
672672
unset($loadedVars['']);
673673

674674
foreach ($values as $name => $_) {
675-
if (!isset($this->overriddenValues[$name]) && isset($_ENV[$name])) {
676-
$this->overriddenValues[$name] = $_ENV[$name];
675+
$alreadyExternal = isset($_ENV[$name]) || isset($_SERVER[$name]) && !str_starts_with($name, 'HTTP_');
676+
if (!isset($this->overriddenValues[$name]) && $alreadyExternal) {
677+
$this->overriddenValues[$name] = $_ENV[$name] ?? $_SERVER[$name];
677678
}
678-
if (isset($loadedVars[$name]) || $overrideExistingVars || !isset($_ENV[$name])) {
679+
if (isset($loadedVars[$name]) || $overrideExistingVars || !$alreadyExternal) {
679680
$this->loadedRawVars[$name] = true;
680681
}
681682
}

Tests/DotenvTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,36 @@ public function testLoadDoesNotReResolveAlreadyLoadedVars()
270270
}
271271
}
272272

273+
public function testLoadDoesNotResolveExternalEnvVarsOnlyPresentInServer()
274+
{
275+
// Mimics PHP's default `variables_order = "GPCS"` (no `E`) where
276+
// OS-provided environment variables (e.g. from Kubernetes envFrom or
277+
// Docker) are placed in $_SERVER but not in $_ENV when PHP starts.
278+
// Such values must be left untouched by Dotenv even when the same key
279+
// has a default value in the loaded .env file.
280+
unset($_ENV['FOO'], $_SERVER['FOO'], $_ENV['SYMFONY_DOTENV_VARS'], $_SERVER['SYMFONY_DOTENV_VARS']);
281+
putenv('FOO');
282+
putenv('SYMFONY_DOTENV_VARS');
283+
284+
$_SERVER['FOO'] = 'abc$def';
285+
286+
@mkdir($tmpdir = sys_get_temp_dir().'/dotenv');
287+
$path = tempnam($tmpdir, 'sf-');
288+
file_put_contents($path, "FOO=default\n");
289+
290+
try {
291+
(new Dotenv())->loadEnv($path, defaultEnv: 'prod');
292+
$this->assertSame('abc$def', $_ENV['FOO']);
293+
$this->assertSame('abc$def', $_SERVER['FOO']);
294+
} finally {
295+
unset($_ENV['FOO'], $_SERVER['FOO'], $_ENV['SYMFONY_DOTENV_VARS'], $_SERVER['SYMFONY_DOTENV_VARS']);
296+
putenv('FOO');
297+
putenv('SYMFONY_DOTENV_VARS');
298+
unlink($path);
299+
@rmdir($tmpdir);
300+
}
301+
}
302+
273303
public function testLoadEnv()
274304
{
275305
$resetContext = static function (): void {

0 commit comments

Comments
 (0)