Знак доллара для взлома пароля mysqldump на AWS

Я размещаю приложение 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", я получаю эту ошибку:

The command "mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -ptest db_name > db.sql" failed

т.е. вместо вставки «test$me» в качестве пароля он вставляет «test».

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

The command "mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test' db_name > db.sql" failed

Имеет ли значение добавление обратной косой черты перед $? Нравится этот 'test\$me'?

Myerffoeg 14.05.2019 16:40

Можете показать свой файл конфигурации?

aynber 14.05.2019 16:40

Возможно, вам повезет больше, если вы создадите файл my.cnf, который может загрузить только файл php, и используйте его вместо этого.

aynber 14.05.2019 16:56

Но, согласно superuser.com/questions/123928/…, вы должны иметь возможность использовать одинарные кавычки в командной строке, если в файле конфигурации также есть пароль в одинарных кавычках.

aynber 14.05.2019 16:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
206
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

dollar sign in it. But when the password does have a dollar sign in it, it is cut off and the command then fails. E.g. if the password is "test$me"

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

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

@AlaaMorad: нет, это приведет к другому результату.

Marcin Orlowski 14.05.2019 16:51

Он выдает этот вывод: команда «mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test' db_name> db.sql» не удалась

GluePear 14.05.2019 16:53

Это указывает на то, что проблема также связана с вашим файлом конфигурации. Где вы вводите свой пароль? Дотенв? или config.php?

Marcin Orlowski 14.05.2019 16:59

В переменной среды Elastic Beanstalk

GluePear 14.05.2019 17:00

что именно это означает? Можете ли вы отредактировать свой вопрос и показать конфиг, где вы устанавливаете пароль (не забудьте использовать поддельные данные)

Marcin Orlowski 14.05.2019 17:03

я хочу сказать, что если это сценарий оболочки (или каким-то образом оценивается оболочкой), то вы получили $xxx часть, уже расширенную оболочкой (по умолчанию неизвестная переменная автоматически расширяется до пустой строки). В PHP это также возможно, однако вы, скорее всего, увидите уведомление PHP

Marcin Orlowski 14.05.2019 17:05

Проблема связана с Elastic Beanstalk.

GluePear 14.05.2019 17:06
Ответ принят как подходящий

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

test\\\$me

Другие вопросы по теме