Вы можете запустить 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.