Heim >Datenbank >MySQL-Tutorial >Wie kann ich Tabellennamen sicher an gespeicherte Prozeduren übergeben, um SQL-Injection zu vermeiden?

Wie kann ich Tabellennamen sicher an gespeicherte Prozeduren übergeben, um SQL-Injection zu vermeiden?

Barbara Streisand
Barbara StreisandOriginal
2025-01-15 12:18:46900Durchsuche

How Can I Safely Pass Table Names to Stored Procedures to Avoid SQL Injection?

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:

  1. Erstellen Sie eine parametrisierte gespeicherte Prozedur:

    • Erstellen Sie eine gespeicherte Prozedur, die einen Tabellennamenparameter akzeptiert.
    • Generieren Sie die Abfrage dynamisch unter Verwendung des während des Vorgangs übergebenen Tabellennamens.
    • Stellen Sie sicher, dass der übergebene Tabellenname anhand einer Whitelist validiert wird, oder verwenden Sie eine Suche, um böswillige Eingaben zu verhindern.
  2. Dynamisches SQL während des Prozesses generieren:

    • Kombinieren von SQL-Anweisungen mithilfe übergebener Tabellennamen in gespeicherten Prozeduren.
    • Verwenden Sie die EXECUTE SQL-Anweisung, um dynamisches SQL auszuführen.

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:

  • Sicherheit: Dieser Ansatz verhindert SQL-Injection-Angriffe, indem er die Verwendung übergebener Zeichenfolgen für die dynamische SQL-Ausführung vermeidet.
  • Klarheit: Parametrisierte Abfragen tragen dazu bei, dass Ihr Code organisiert und leicht zu warten ist.
  • Effizienz: Gespeicherte Prozeduren können zwischengespeichert und wiederverwendet werden, was die Leistung im Vergleich zu dynamischem SQL verbessert.

Weitere Hinweise:

  • QUOTENAME wird im Beispiel verwendet, um sicherzustellen, dass Sonderzeichen im übergebenen Tabellennamen ordnungsgemäß maskiert werden.
  • Verwenden Sie INFORMATION_SCHEMA für eine Lookup-Transformation, um den eingegebenen Tabellennamen zu validieren.
  • Bei Bedarf können Spaltennamen auch dynamisch über SQL-Parameter übergeben werden.

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!

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