Имена переменного столбца с помощью подготовленных операторов

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

Я использую MySQL и Java.

Когда я пробую его:

String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");

Я получаю этот тип оператора (печатающий прямо перед выполнением).

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'

Я хотел бы видеть однако:

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'

Я знаю, что не могу сделать этого для имен таблиц, как обсуждено здесь, но задавался вопросом, был ли некоторый способ сделать это для имен столбцов.

Если нет, то я должен буду просто попытаться удостовериться, что я санирую вход, таким образом, он не приводит к уязвимостям Внедрения SQL.

38
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

Это указывает на неправильный дизайн БД. Пользователю не нужно знать имена столбцов.Создайте настоящий столбец БД, содержащий эти «имена столбцов», и вместо этого храните данные в нем.

В любом случае, вы не можете установить имена столбцов как значения PreparedStatement . Вы можете установить только значения столбца как PreparedStatement значения

. Если вы хотите продолжить в этом направлении, вам необходимо очистить имена столбцов (чтобы избежать SQL-инъекции ) и объедините / создайте строку SQL самостоятельно. Заключите отдельные имена столбцов в кавычки и используйте String # replace () , чтобы экранировать ту же кавычку внутри имени столбца.

35
ответ дан 27 November 2019 в 03:50
поделиться

Я думаю, что этот случай не может работать, потому что весь смысл подготовленного оператора состоит в том, чтобы помешать пользователю вводить неэкранированные биты запроса - поэтому вы всегда будете цитировать текст или сбежал.

Вам необходимо очистить этот ввод в Java, если вы хотите безопасно повлиять на структуру запроса.

2
ответ дан 27 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: