Знак доллара при взломе пароля mysqldump на AWS - PullRequest
0 голосов
/ 14 мая 2019

Я размещаю приложение Laravel на Elastic Beanstalk.У меня есть команда ремесленника, которая запускает mysqldump:

$command = 'mysqldump -h%s -u%s -p%s %s > ' . storage_path($filename);
$c = sprintf(
            $command,
            config('database.connections.host'),
            config('database.connections.username'),
            config('database.connections.password'),
            $destinationDatabase
        );
$this->process = new Process($c);

. Это работает, когда пароль (который я храню в переменной среды) не имеет знака доллара.Но когда в пароле есть знак доллара, он обрезается и команда не выполняется.Например, если пароль «test $ me», я получаю эту ошибку:

Команда «mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -ptest db_name> db.sql "fail

Т.е. вместо ввода" test $ me "для пароля, он вставляет" test ".

Я попытался добавить одинарные кавычки вокруг пароля в средепеременная, происходит то же самое:

Команда "mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test" db_name> db.sql "завершилась неудачно

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я следовал этому ответу и префикс трех обратных слешей $ в моей переменной среды Elastic Beanstalk:

test\\\$me

0 голосов
/ 14 мая 2019

знак доллара в нем.Но когда в пароле есть знак доллара, он обрезается и команда не выполняется.Например, если пароль «test $ me»

Похоже, что при вызове используется строка без экранирования, которая затем разрешается оболочкой (которая также использует $ для обозначения переменных),Вы должны экранировать все аргументы, переданные с помощью escapeshellarg () , чтобы противостоять этому:

$c = sprintf(
            $command,
            escapeshellarg(config('database.connections.host')),
            escapeshellarg(config('database.connections.username')),
            escapeshellarg(config('database.connections.password')),
            escapeshellarg($destinationDatabase)
        );
...