0Pricing
Python Academy · Lektion

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

  1. Verbindungen herstellen und Tabellen erstellen
  2. Insert, Select, Update, Delete
  3. Parametrisierte Abfragen
  4. Transaktionen und Context Manager
← Zurück zu Python Academy