it-swarm.com.de

Variablenspaltennamen mit vorbereiteten Anweisungen

Ich habe mich gefragt, ob es trotzdem möglich war, Spaltennamen mit vorbereiteten Anweisungen anzugeben. 

Ich verwende MySQL und Java.

Wenn ich es versuche:

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

Ich bekomme diese Art von Anweisung (Druck direkt vor der Ausführung).

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

Ich würde aber gerne sehen:

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

Ich weiß, dass ich dies nicht für Tabellennamen tun kann, wie oben besprochen hier , aber ich habe mich gefragt, ob es eine Möglichkeit für Spaltennamen gibt.

Wenn dies nicht der Fall ist, muss ich nur versuchen, sicherzustellen, dass die Eingabe desinfiziert wird, damit es nicht zu SQL-Injection-Schwachstellen kommt.

32
KLee1

Dies weist auf einen fehlerhaften DB-Entwurf hin. Der Benutzer sollte nicht über die Spaltennamen Bescheid wissen müssen. Erstellen Sie eine echte DB-Spalte, die diese "Spaltennamen" enthält, und speichern Sie stattdessen die Daten.

Nein, Sie können keine Spaltennamen als PreparedStatement-Werte festlegen. Sie können nur Spalte values ​​ als PreparedStatement-Werte festlegen

Wenn Sie in diese Richtung fortfahren möchten, müssen Sie die Spaltennamen bereinigen und die SQL-Zeichenfolge selbst verketten/erstellen. Zitieren Sie die einzelnen Spaltennamen und verwenden Sie String#replace() , um dasselbe Zitat im Spaltennamen zu speichern.

32
BalusC

Bereiten Sie eine Whitelist der zulässigen Spaltennamen vor. Verwenden Sie die Abfrage, um in der Whitelist nachzuschlagen, ob der Spaltenname vorhanden ist. Wenn nicht, lehnen Sie die Abfrage ab.

15
wgl

Ich denke, dass dieser Fall nicht funktionieren kann, da der Zweck der vorbereiteten Anweisung darin besteht, zu verhindern, dass der Benutzer nicht abgelegte Abfragebits einfügt. Der Text wird daher immer in Anführungszeichen gesetzt.

Sie müssen diese Eingabe in Java bereinigen, wenn Sie die Abfragestruktur sicher beeinflussen möchten.

2
G__
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
}
1
Grbh Niti

Verwenden Sie den SQL-Einspritzungsnachteil von Statement Interface als Vorteil . Beispiel:

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