ventajas stmt statements sentencias sentencia procedimiento prepared preparadas preparada desventajas almacenado java sql jdbc prepared-statement

java - stmt - Nombres de columnas variables usando declaraciones preparadas



select sentencia preparada (6)

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

String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);

Me preguntaba si había alguna forma de especificar los nombres de columna devueltos 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");

Recibo este tipo de declaración (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ó here , 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 entrada para que no dé lugar a vulnerabilidades de inyección de SQL.


Creo que este caso no puede funcionar porque el objetivo de la declaración preparada es evitar que el usuario ingrese bits de consulta no escaneados, de modo que siempre tendrá el texto cotizado o escapado.

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


Esto indica un mal diseño 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 PreparedStatement . Solo puede establecer valores de columna como valores PreparedStatement

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


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


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 ");


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 }