В нашем приложении мы принимаем пользовательский ввод (например, имя проекта), а затем используем его для создания базы данных для пользователя (среди прочего). Я хотел бы предотвратить внедрение SQL, но не могу подготовить оператор SQL для создания базы данных и предоставления доступа. Есть ли безопасный способ запретить пользователям вводить SQL? Все, что я мог подумать, это ограничить ввод буквами английского алфавита и пробелами (а для имени БД заменить их символами подчеркивания), что, в свою очередь, могло бы обеспечить защиту, если мы заключим наши операторы SQL в одинарные кавычки. Это правдоподобное решение?
Мы используем загрузку java 8 / spring с базой данных Postgres 10.6. Я поиграл с SQL, и подготовленное заявление, насколько я понимаю, может использоваться только для запросов, таких как обновление, удаление и обновление. Я попытался поиграться с кодом, чтобы удалить некоторые таблицы из пользовательского ввода, но, к счастью, это не сработало, но я хотел бы быть уверен, что приложение не осталось уязвимым.
String createDbSQL = "create database ?";
Connection connection = DriverManager.getConnection(env.getDbUrl(), env.getDbUsername(), env.getDbPassword());
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement(createDbSQL);
preparedStatement.setString(1, "test_db_name");
preparedStatement.execute();
завершается с org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
(что имеет смысл, если подготовленный оператор не может быть использован для создания базы данных`
PREPARE foo (text) AS create alter database $1;
ожидает выражения запроса и не работает