← SEARCHABLE ARCHIVE
Web · 2026-07-14

Wie kann man eine SQL-Injection verhindern?

Verteidigung mit vorbereiteten Aussagen und geringsten Privilegien

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Die SQL-Injection wird nicht durch das Entfernen aller Anführungszeichen aus der Eingabe verhindert. SQL-Befehle und Benutzerdaten müssen von Anfang an getrennt werden, damit die Daten nicht als Befehle interpretiert werden.

Verwenden Sie vorbereitete Anweisungen

„Vorbereitete Anweisung“ oder „parametrisierte Abfrage“ markieren separat die Stelle, an der der Wert in der SQL-Anweisung platziert werden soll.

const sql = 'SELECT id, name, password_hash FROM users WHERE name = ?';
const [rows] = await database.execute(sql, [userName]);

if (rows.length === 1)
{
    const passwordMatches = await passwordHasher.verify(
        rows[0].password_hash,
        password
    );
}

Hier?Der eingegebene Wert wird als Daten übertragen, nicht als SQL-Grammatik. Wenn der Benutzer Anführungszeichen oder verwendetORAuch wenn Sie dieselbe Zeichenfolge eingeben, kann die Abfragestruktur nicht geändert werden.

Passwörter werden in SQL nicht zwischen Klartexten verglichen. Nach dem Abrufen der Benutzerinformationen als Parameterabfrage wird der Eingabewert mit einem Hash verglichen, der in einer verifizierten Passwort-Hash-Bibliothek gespeichert ist.

Die Verwendung eines ORM macht nicht automatisch alles sicherer. Die gleiche Schwachstelle tritt auf, wenn Raw Query ohne Verwendung der von ORM bereitgestellten Parameterfunktion zu einem String zusammengefasst wird.

Tabellennamen und Sortierkriterien werden anhand der Zulassungsliste überprüft.

Parameter werden im Allgemeinen für Werte verwendet. Tabellenname, Spaltenname,ASCMichDESCIn vielen Fällen kann dieselbe SQL-Grammatikposition nicht als Parameter verarbeitet werden.

Diese Werte werden nicht als Zeichenfolge des Benutzers eingefügt, sondern aus der vom Server vorgegebenen Zulassungsliste ausgewählt.

const allowedSortColumns = {
    newest: 'created_at',
    name: 'name'
};

const sortColumn = allowedSortColumns[requestedSort] ?? 'created_at';
const sql = `SELECT id, name FROM users ORDER BY ${sortColumn} DESC`;

requestedSortEs ist wichtig, es in eine sichere Zeichenfolge zu konvertieren, die dem Server gehört, anstatt sich selbst in SQL zu übertragen.

Reduzieren Sie die Berechtigungen des Datenbankkontos

Wenn dem vom Webserver verwendeten Datenbankkonto Administratorrechte gewährt werden, kann sich der Schaden durch eine einzelne Schwachstelle auf die gesamte Datenbank ausweiten.

  • Funktionen, die nur Suchen durchführen, erhalten nur Leseberechtigung.
  • Greifen Sie nur auf die Tabellen zu, die Sie benötigen.
  • Führen Sie keine Datenbankverwaltungsaufgaben mit dem Webanwendungskonto durch.
  • Passwörter werden nicht im Klartext gespeichert, sondern mithilfe eines verifizierten Hash-Verfahrens.

Fehler werden auf dem Server protokolliert und für den Benutzer verborgen.

Wenn Sie unverändert mit einem detaillierten SQL-Fehler antworten, werden möglicherweise interne Strukturen wie Tabellennamen oder Spaltennamen offengelegt. Dem Benutzer sollte eine allgemeine Fehlermeldung angezeigt werden und detaillierte Fehler sollten in einem Serverprotokoll mit kontrolliertem Zugriff protokolliert werden.

Eingabevalidierung, Firewall und Erkennungstools können ebenfalls hilfreich sein. Als erstes gilt es jedoch, alle Abfragen zu parametrisieren, die dynamisch eingegebene SQL-Syntax auf eine Whitelist zu beschränken und die Datenbankberechtigungen zu minimieren.