Me preguntaba si había alguna forma de especificar los nombres de las columnas devueltas usando declaraciones preparadas.Nombres de columnas variables usando declaraciones preparadas
Estoy usando MySQL y Java.
Cuando lo intento:
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");
consigo este tipo de declaración (impresión justo antes de la ejecución).
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Me gustaría ver al menos:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Yo sé que no puedo hacer esto para nombres de tabla, como se discutió here, pero se preguntaba si había alguna manera de hacerlo para la columna nombres.
Si no lo hay, entonces solo tendré que intentar asegurarme de que saneo la entrada para que no dé lugar a vulnerabilidades de inyección de SQL.
Bueno, el usuario no necesita saber los nombres de las columnas, pero los nombres de las columnas necesarias se deducen en función de los formularios enviados por el usuario. Sin embargo, esto se maneja desde el lado del cliente, así que quería ver si había alguna forma de garantizar que los datos estuvieran seguros. ¿Debería entonces mover todo el lote al lado del servidor, asegurando así que los datos de la columna no estén contaminados? – KLee1
En cambio, tráelo en el lado del servidor. No hagas negocios en el lado del cliente. – BalusC
@BalusC: _ "no puede establecer nombres de columnas como valores PreparedStatement" _ - eso está completamente inventado. El uso de nombres de columna dentro de las listas de valores de las declaraciones preparadas es, por supuesto, posible, pero eso no significa que deba usarse de esa manera, todavía es un mal diseño. – specializt