Heim >Datenbank >MySQL-Tutorial >Wie kann ich Daten mit dynamischen Spaltennamen mithilfe vorbereiteter Anweisungen in MySQL und Java abrufen?
Dynamischer Spaltennamenabruf in MySQL und Java mithilfe vorbereiteter Anweisungen: Ein sichererer Ansatz
Viele MySQL- und Java-Entwickler haben versucht, vorbereitete Anweisungen zum Abrufen von Daten mit dynamisch generierten Spaltennamen zu verwenden. Das direkte Ersetzen von Spaltennamen in den Parametern einer vorbereiteten Anweisung wird jedoch nicht unterstützt und birgt erhebliche Sicherheitsrisiken. Eine Neugestaltung des Datenbankschemas ist normalerweise die beste Lösung.
Der Versuch, vorbereitete Anweisungen auf diese Weise zu verwenden, wie unten gezeigt, führt zu einem Fehler:
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
Die Abfrage behandelt den Platzhalter ?
als Zeichenfolgenliteral und nicht als Spaltennamen.
Um SQL-Injection-Schwachstellen zu vermeiden, besteht eine robustere Methode darin, die dynamischen Spaltennamen in der Datenbank selbst zu speichern. Stellen Sie sich eine Tabelle wie „user_data“ mit diesen Spalten vor:
id
(Primärschlüssel)user_name
column_names
(eine durch Kommas getrennte Zeichenfolge von Spaltennamen)Die SQL-Abfrage kann dann durch Verketten der aus dieser Tabelle abgerufenen column_names
erstellt werden:
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
Dieser Ansatz stellt sicher, dass die Spaltennamen nicht als Parameter behandelt werden, die für Injektionsangriffe anfällig sind. Obwohl die Zeichenfolgenverkettung verwendet wird, wird der anfällige Teil (die Spaltennamen) bereits bereinigt, indem er aus der Datenbank abgerufen wird. Denken Sie daran, stets alle vom Benutzer bereitgestellten Daten zu bereinigen, die bei der Abfrageerstellung verwendet werden, auch wenn sie nicht direkt Teil der SQL-Anweisung sind. Dieser überarbeitete Ansatz bietet eine sicherere und besser verwaltbare Lösung für den Umgang mit dynamischen Spaltennamen.
Das obige ist der detaillierte Inhalt vonWie kann ich Daten mit dynamischen Spaltennamen mithilfe vorbereiteter Anweisungen in MySQL und Java abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!