Parametrisierte Abfragen
SQL-Injection verhindern
Parametrisierte Abfragen ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Die Gefahr des Zusammensetzens von Zeichenketten
SQL durch das Verketten von Zeichenketten zusammenzusetzen, ist riskant. Wenn Benutzereingaben SQL enthalten, können sie Ihre Abfrage verändern. Das nennt man SQL-Injection.
Verwenden Sie dies niemals mit nicht vertrauenswürdigen Daten.
name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)So sieht eine Injection aus
Stellen Sie sich einen bösartigen Wert vor. Durch das Verketten ändert sich die Bedeutung der Abfrage vollständig.
name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')Platzhalter als sichere Lösung
Der sichere Weg sind parametrisierte Abfragen. Verwenden Sie ? als Platzhalter und übergeben Sie die Werte als Tupel. Der Treiber maskiert sie sicher.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Mehrere Platzhalter
Verwenden Sie einen ?-Platzhalter pro Wert. Übergeben Sie die Werte in einem Tupel in derselben Reihenfolge, in der die Platzhalter vorkommen.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Tupel mit einem einzelnen Wert
Ein Tupel mit einem Element benötigt ein abschließendes Komma: ('Alice',). Ohne dieses Komma behandelt Python die Klammern lediglich als Gruppierung.
good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))Injectionsversuch blockiert
Mit Platzhaltern wird ein bösartiger Wert als normale Daten und nicht als SQL behandelt. Er liefert einfach keine Übereinstimmungen.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
evil = "x' OR '1'='1"
cur.execute('SELECT * FROM users WHERE name = ?', (evil,))
print('Rows matched:', cur.fetchall())
conn.close()Benannte Platzhalter
SQLite unterstützt auch benannte Platzhalter mit der Syntax :name. Übergeben Sie ein Dictionary mit den Werten.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (:n, :a)', {'n': 'Carol', 'a': 40})
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Parameter in WHERE
Platzhalter funktionieren in jeder Klausel, die einen Wert aufnimmt, einschließlich WHERE.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT name FROM users WHERE age > ?', (28,))
print(cur.fetchall())
conn.close()executemany
Um viele Zeilen einzufügen, verwenden Sie executemany() mit einer Liste von Tupeln. Das ist schneller und bleibt sicher.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
rows = [('Alice',), ('Bob',), ('Carol',)]
cur.executemany('INSERT INTO users (name) VALUES (?)', rows)
cur.execute('SELECT COUNT(*) FROM users')
print(cur.fetchone())
conn.close()Platzhalter sind nicht für Bezeichner geeignet
Platzhalter funktionieren nur für Werte, nicht für Tabellen- oder Spaltennamen. Diese müssen in Ihrem eigenen Code aus einer vertrauenswürdigen Whitelist stammen.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
allowed = {'name', 'id'}
col = 'name'
if col in allowed:
cur.execute('SELECT ' + col + ' FROM users')
print('Safe column query ran')
conn.close()Eine wiederverwendbare Insert-Funktion
Wenn Sie parametrisierte Inserts in eine Funktion kapseln, bleibt Ihr Code übersichtlich und durchgehend sicher.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
def add_user(cursor, name):
cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))
add_user(cur, 'Dave')
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Kurze Überprüfung
Testen Sie Ihr Wissen über sichere Abfragen.
Zusammenfassung
Sie haben gelernt, abwehrsichere Abfragen gegen SQL-Injection zu schreiben.
- Verketten Sie niemals nicht vertrauenswürdige Eingaben mit SQL
- Verwenden Sie
?-Platzhalter mit einem Tupel aus Werten - Benannte
:name-Platzhalter benötigen ein Dict executemany()fügt viele Zeilen sicher ein- Platzhalter sind für Werte, nicht für Bezeichner vorgesehen
Häufig gestellte Fragen
Ist die Lektion „Parametrisierte Abfragen“ kostenlos?
Ja — der vollständige Text von „Parametrisierte Abfragen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Parametrisierte Abfragen“?
SQL-Injection verhindern Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Parametrisierte Abfragen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Verbindungen herstellen und Tabellen erstellen
- Insert, Select, Update, Delete
- Parametrisierte Abfragen
- Transaktionen und Context Manager