Ich habe mich gefragt, ob es sowieso möglich war, zurückgegebene Spaltennamen mit vorbereiteten Anweisungen anzugeben.Variablenspaltennamen mit vorbereiteten Anweisungen
Ich benutze MySQL und Java.
Wenn ich versuche es:
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 diese Art von Anweisung erhalten (Druck direkt vor der Ausführung).
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
ich aber sehen möchte:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Ich weiß, dass ich dies für Tabellennamen nicht tun können, here als diskutiert, aber frage mich, ob es irgendeine Art und Weise war es für die Spalte zu tun Namen.
Wenn nicht, dann muss ich nur versuchen und sicherstellen, dass ich die Eingabe bereinigt, so dass es nicht zu SQL-Injection-Schwachstellen führt.
Nun, der Benutzer braucht die Spaltennamen nicht wirklich zu kennen, aber die benötigten Spaltennamen werden basierend auf den vom Benutzer übermittelten Formularen abgeleitet. Dies wird jedoch auf der Client-Seite gehandhabt, also wollte ich sehen, ob es einen Weg gibt, um sicherzustellen, dass die Daten sicher sind. Soll ich dann einfach die ganze Menge auf die Serverseite verschieben und dadurch sicherstellen, dass die Spaltendaten nicht verändert werden? – KLee1
Behandeln Sie es stattdessen auf der Serverseite. Machen Sie keine geschäftlichen Dinge auf der Client-Seite. – BalusC
@BalusC: _ "Sie können Spaltennamen nicht als PreparedStatement-Werte festlegen" _ - das ist komplett erfunden. Die Verwendung von Spaltennamen in vorbereiteten Anweisungswertlisten ist natürlich möglich - aber das bedeutet nicht, dass es auf diese Weise verwendet werden sollte, es ist immer noch ein schlechtes Design. – specializt