[DI] Use reproducible entropy to generate env placeholders

This commit is contained in:
Nicolas Grekas 2019-11-14 19:27:47 +01:00
parent d863fc2b4b
commit 600ae33262

View File

@ -24,6 +24,8 @@ class EnvPlaceholderParameterBag extends ParameterBag
private $unusedEnvPlaceholders = []; private $unusedEnvPlaceholders = [];
private $providedTypes = []; private $providedTypes = [];
private static $counter = 0;
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
@ -57,7 +59,7 @@ class EnvPlaceholderParameterBag extends ParameterBag
} }
} }
$uniqueName = md5($name.uniqid(mt_rand(), true)); $uniqueName = md5($name.'_'.self::$counter++);
$placeholder = sprintf('%s_%s_%s', $this->getEnvPlaceholderUniquePrefix(), str_replace(':', '_', $env), $uniqueName); $placeholder = sprintf('%s_%s_%s', $this->getEnvPlaceholderUniquePrefix(), str_replace(':', '_', $env), $uniqueName);
$this->envPlaceholders[$env][$placeholder] = $placeholder; $this->envPlaceholders[$env][$placeholder] = $placeholder;
@ -72,7 +74,13 @@ class EnvPlaceholderParameterBag extends ParameterBag
*/ */
public function getEnvPlaceholderUniquePrefix(): string public function getEnvPlaceholderUniquePrefix(): string
{ {
return $this->envPlaceholderUniquePrefix ?? $this->envPlaceholderUniquePrefix = 'env_'.bin2hex(random_bytes(8)); if (null === $this->envPlaceholderUniquePrefix) {
$reproducibleEntropy = unserialize(serialize($this->parameters));
array_walk_recursive($reproducibleEntropy, function (&$v) { $v = null; });
$this->envPlaceholderUniquePrefix = 'env_'.substr(md5(serialize($reproducibleEntropy)), -16);
}
return $this->envPlaceholderUniquePrefix;
} }
/** /**