Nombres de columnas variables usando declaraciones preparadas

Resuelto KLee1 asked hace 14 años • 7 respuestas

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.

KLee1 avatar Jun 29 '10 03:06 KLee1
Aceptado

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 PreparedStatementvalores. Solo puede establecer valores de columna como PreparedStatementvalores

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.

BalusC avatar Jun 28 '2010 20:06 BalusC

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.

wgl avatar Apr 26 '2012 00:04 wgl