Я задавался вопросом, должен ли там был так или иначе указать возвращенные имена столбцов с помощью подготовленных операторов.
Я использую 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.
Это указывает на неправильный дизайн БД. Пользователю не нужно знать имена столбцов.Создайте настоящий столбец БД, содержащий эти «имена столбцов», и вместо этого храните данные в нем.
В любом случае, вы не можете установить имена столбцов как значения PreparedStatement
. Вы можете установить только значения столбца как PreparedStatement
значения
. Если вы хотите продолжить в этом направлении, вам необходимо очистить имена столбцов (чтобы избежать SQL-инъекции ) и объедините / создайте строку SQL самостоятельно. Заключите отдельные имена столбцов в кавычки и используйте String # replace ()
, чтобы экранировать ту же кавычку внутри имени столбца.
Я думаю, что этот случай не может работать, потому что весь смысл подготовленного оператора состоит в том, чтобы помешать пользователю вводить неэкранированные биты запроса - поэтому вы всегда будете цитировать текст или сбежал.
Вам необходимо очистить этот ввод в Java, если вы хотите безопасно повлиять на структуру запроса.