Nombres de columnas variables usando declaraciones preparadas

Me preguntaba si había alguna forma de especificar los nombres de columna devueltos usando declaraciones preparadas.

Estoy usando MySQL y Java.

Cuando lo bash:

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 statement (imprimiendo justo antes de la ejecución).

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

Me gustaría ver sin embargo:

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

Sé que no puedo hacer esto para los nombres de las tablas, como se discutió aquí , pero me preguntaba si había alguna forma de hacerlo para los nombres de las columnas.

Si no lo hay, entonces solo tendré que tratar de asegurarme de que desinfecte la input para que no dé lugar a vulnerabilidades de inyección de SQL.

Esto indica un mal layout de DB. El usuario no debería necesitar conocer los nombres de las columnas. Cree una columna DB real que contenga esos "nombres de columna" y almacene los datos a lo largo de ella.

En cualquier caso, no, no puede establecer los nombres de columna como valores PrepanetworkingStatement . Solo puede establecer valores de columna como valores PrepanetworkingStatement

Si desea continuar en esta dirección, necesita desinfectar los nombres de columna y concatenar / comstackr la cadena SQL usted mismo. Cite los nombres de las columnas separadas y use String#replace() para escaping de la misma cita dentro del nombre de la columna.

Prepare una list blanca de nombres de columna permitidos. Use la 'consulta' para search en la list blanca para ver si el nombre de la columna está allí. Si no, rechace la consulta.

Creo que este caso no puede funcionar porque el objective de la statement preparada es evitar que el usuario ingrese bits de consulta no escaneados, de modo que siempre tendrá el text cotizado o escapado.

Tendrá que desinfectar esta input en Java si desea afectar la estructura de la consulta de forma segura.

Use la desventaja de inyección sql de Statement Interface como ventaja. Ex:

 st=conn.createStatement(); String columnName="name"; rs=st.executeQuery("select "+ columnName+" from ad_org "); 

A continuación está la solución en java.

 String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName); 
 public void MethodName(String strFieldName1, String strFieldName2, String strTableName) { //Code to connect with database String strSQLQuery=String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName); st=conn.createStatement(); rs=st.executeQuery(strSQLQuery); //rest code }