Heim >Datenbank >MySQL-Tutorial >Wie kann ich Daten mit dynamischen Spaltennamen mithilfe vorbereiteter Anweisungen in MySQL und Java abrufen?

Wie kann ich Daten mit dynamischen Spaltennamen mithilfe vorbereiteter Anweisungen in MySQL und Java abrufen?

Susan Sarandon
Susan SarandonOriginal
2025-01-19 17:32:09702Durchsuche

How Can I Retrieve Data with Dynamic Column Names Using Prepared Statements in MySQL and Java?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn