Heim >Datenbank >MySQL-Tutorial >Wie kann ich Tabellennamen sicher an gespeicherte Prozeduren übergeben, um SQL-Injection zu vermeiden?
Tabellennamen an gespeicherte Prozedur übergeben
Bei der Datenbankprogrammierung ist es häufig erforderlich, Abfragen zu schreiben, die auf der Grundlage von Benutzereingaben auf bestimmte Tabellen verweisen. Bei herkömmlichen Ansätzen werden SQL-Anweisungen dynamisch in Clientanwendungen erstellt, was Sicherheitsbedenken aufwirft und allgemein als schlechte Praxis gilt.
Stattdessen besteht eine sauberere und sicherere Lösung darin, den Tabellennamen als Parameter an die gespeicherte Prozedur zu übergeben. Allerdings ergeben sich Herausforderungen, wenn sich die Zieltabelle aufgrund von Benutzereingaben ändert.
Herausforderung:
In einigen Fällen wird die Zieltabelle basierend auf Benutzereingaben ausgewählt. Wenn die Eingabewerte beispielsweise „FOO“ und „BAR“ lauten, könnte die Abfrage „SELECT * FROM FOO_BAR“ lauten. Wie können wir solche Abfragen parametrisieren, um SQL-Injection zu vermeiden und die übergebene Zeichenfolge für die dynamische SQL-Ausführung zu verwenden?
Lösung:
Der empfohlene Ansatz ist die Verwendung einer Kombination aus parametrisierten gespeicherten Prozeduren und dynamischem SQL:
Erstellen Sie eine parametrisierte gespeicherte Prozedur:
Dynamisches SQL während des Prozesses generieren:
Beispiel einer gespeicherten Prozedur:
<code class="language-sql">CREATE PROC spCountAnyTableRows( @PassedTableName AS NVARCHAR(255) ) AS BEGIN DECLARE @ActualTableName AS NVARCHAR(255) SELECT @ActualTableName = QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @PassedTableName DECLARE @sql AS NVARCHAR(MAX) SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC sp_executesql @sql END</code>
Vorteile:
Weitere Hinweise:
Diese überarbeitete Ausgabe behält die Originalsprache bei, vermeidet eine Änderung der Bedeutung, behält das Bild in seinem ursprünglichen Format und seiner ursprünglichen Position bei und bietet eine leicht umformulierte und prägnantere Erklärung. Das SQL-Beispiel wird durch die Verwendung von sp_executesql
leicht verbessert bevorzugt für bessere Sicherheit und Handhabung der Parameter.
Das obige ist der detaillierte Inhalt vonWie kann ich Tabellennamen sicher an gespeicherte Prozeduren übergeben, um SQL-Injection zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!