Внедрение SQL-выражений из командной строки - PullRequest
0 голосов
/ 27 марта 2019

Этот связанный вопрос спрашивает об использовании параметризованного запроса при использовании инструмента командной строки mysql в bash. Однако, кажется, что верхний ответ все еще уязвим для инъекций (например, ; DROP TABLE user; --). Хотя ответ определенно касается вопроса о том, как передать переменные на всех , он не решает вопрос о том, как это сделать с помощью параметризованных запросов .

Мой вопрос: Обеспечивает ли связанный принятый ответ в связанном вопросе защиту от SQL-инъекций и имеет ли все полезные средства защиты от параметризации? Если так, то почему? Если нет, как я могу безопасно использовать параметризованный запрос из инструмента командной строки MySQL?

Примечание: Технически я работаю mysql Ver 15.1 Distrib 10.3.13-MariaDB.

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

Обычной практикой для приложений, ориентированных на клиента, является использование конечной точки API для каждого запроса к базе данных, что потребует аутентификации пользователя.Затем сервер API проверит входные данные при форматировании запроса.

Непосредственная демонстрация bash на сервере никогда не будет хорошей идеей.Помимо SQL-инъекций, могут легко возникнуть и другие, гораздо худшие ситуации, такие как ; scp ~/.ssh/id_rsa my_proxy ;.


По-видимому, безопасность не является главной задачей OP, основываясь на комментариях ниже.Скорее, основное внимание уделяется созданию правильных запросов.

Для этого простейшим решением является, возможно, использование существующих библиотек и предоставление им возможности обрабатывать форматирование.Например, в Python есть

https://dev.mysql.com/doc/connector-python/en/

Обычно для повышения эффективности вставка должна выполняться партиями.Но если вы предпочитаете, вы можете написать скрипт для вставки строки, например

python3 tableX_insert.py --field1 value1 --field2 value2

Я уверен, что в других языках аналогичные модули для DB conn и cursor существуют.Любая попытка сделать то же самое с командной строкой raw bash - это заново изобрести колеса.

1 голос
/ 27 марта 2019

Вы можете запустить PREPARE и EXECUTE в сценарии SQL, чтобы выполнить параметризованные операторы, но затем сложная задача для сценария bash - получить значения, назначенные переменным сеанса в сценарии SQL, без введения SQL-инъекции.Уязвимость.

Я имею в виду, что вы можете сделать это:

myshellvar=1234
mysql -e "set @myvar = $myshellvar ; prepare stmt from 'select ?'; execute stmt using @myvar"

+------+
| ?    |
+------+
| 1234 |
+------+

Но это все еще уязвимо для SQL-инъекций, поскольку $myshellvar может содержать проблемный контент.

Я сделал этоЭксперимент:

echo "O'Reilly" > /tmp/name

mysql -e "set @myvar = replace(load_file('/tmp/name'), '\n', ''); prepare stmt from 'select ?'; execute stmt using @myvar"
+----------+
| ?        |
+----------+
| O'Reilly |
+----------+

Это безопасный способ убедиться, что контент не вызывает SQL-инъекцию, но вам понадобится экземпляр MySQL, настроенный для разрешения load_file(), и кажется, что это многоработать, потому что вам нужно создать отдельный файл для каждой переменной, которую вы хотите загрузить.

Я согласен с ответом @ PMHui о том, что вам следует использовать другой язык сценариев, если вы хотите удобно писать параметризованные запросы SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...