Nombres de columnas variables usando declaraciones preparadas
Me preguntaba si había alguna forma de especificar los nombres de las columnas devueltas mediante declaraciones preparadas.
Estoy usando MySQL y Java.
Cuando lo pruebo:
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");
Recibo este tipo de declaración (la imprimo justo antes de la ejecución).
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Sin embargo, me gustaría ver:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Sé que no puedo hacer esto con los nombres de las tablas, como se analiza aquí , pero me preguntaba si había alguna forma de hacerlo con los nombres de las columnas.
Si no es así, tendré que intentar asegurarme de desinfectar la entrada para que no genere vulnerabilidades de inyección SQL.
Esto indica un mal diseño de base de datos. El usuario no debería necesitar conocer los nombres de las columnas. Cree una columna de base de datos real que contenga esos "nombres de columnas" y, en su lugar, almacene los datos junto con ella.
Y de cualquier manera, no, no puedes establecer nombres de columnas como PreparedStatement
valores. Solo puede establecer valores de columna como PreparedStatement
valores
Si desea continuar en esta dirección, debe desinfectar los nombres de las columnas (para evitar la inyección SQL ) y concatenar/construir la cadena SQL usted mismo. Cite los nombres de las columnas separadas y utilícelas String#replace()
para escapar de la misma comilla dentro del nombre de la columna.
Prepare una lista blanca de nombres de columnas permitidos. Utilice la 'consulta' para buscar en la lista blanca y ver si el nombre de la columna está allí. En caso contrario, rechace la consulta.