Dies ist eine alte Version des Dokuments!
LU10c - SQLi Gegenmassnahmen
Glücklicherweise gibt gegen alle SQLi-Varianten entsprechende Gegenmassnahmen. Die hier vorliegende Liste ist daher nur ein Ausschnitt mit den prominentesten.
Escaping
Beim escaping werden Sonderzeichen nicht direkt in die Datenbank weitergeleitet. Die vom User eingegebenen Werte werden durch eine entsprechende Funktion/Methode, die es in vielen Programmiersprachen gibt vor der Weiterleitung gefiltert. Sonderzeichen, die den Angriffspunkt darstelle, werden von gefährlichen Steuerzeichen in harmlose Characters umgewandelt.Das „Escapen“ kann dabei auf der Client- und Serverseite geschehen.
Das Hauptproblem bei SQLI besteht darin, dass Werte ungeprüft in die Datenbank weitergegeben werden, wobei Platzhalter mit vom User zur Laufzeit eingegebenen Werten angereichert werden. Enthält eine solcher zur Laufzeit generierte SQL-Anweisung Injektion, wird diese ungeprüft und ungepuffert an die DB weitergeleitet.
Parametrisierte Werteübergabe
Die parametrisierte Werteübergabe, kurz Parametrisierung genannt, kann eine mögliche Gegenmassnahme gegen SQLI sein. Dabei werden die von User eingegebenen Werte in lokale Parameter geschrieben. Diese Werte werden dann einen Schritt später durch Platzhalter in das SQL-Statement eingefügt.
Das nachfolgende JavaScript/MySQL-Beispiel soll diese Technik verdeutlichen:
// 1. Schritt: Zusammenbau des SQL-Statements mit Platzhaltern const sql1 = ` UPDATE Production.ProductInventory SET Quantity = @qty WHERE ProductID = @productId `;
// 2. Schritt: Parametrisieren der Übergabewerte const qty = 10; const productId = 709;
// 3. Schritt: Zusammenbauen und Ausführen mit Laufzeitwerten const sql = require('mssql'); async function updateInventory() { try { // Verbindung herstellen (Beispielconfig anpassen!) const pool = await sql.connect({ user: 'username', password: 'password', server: 'localhost', database: 'AdventureWorks' }); // const request = pool.request(); request.input('qty', sql.Int, qty); request.input('productId', sql.Int, productId); // const result = await request.query(sql1); console.log('Update erfolgreich:', result.rowsAffected); } catch (err) { console.error('Fehler beim Update:', err); } }
updateInventory();