Geparametriseerde queries
Voorkom SQL-injectie
Geparametriseerde queries is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Het gevaar van tekenreeksen samenvoegen
SQL opbouwen door tekenreeksen samen te voegen is riskant. Als invoer van een gebruiker SQL bevat, kan die invoer je query wijzigen. Dit heet SQL-injectie.
Doe dit nooit met niet-vertrouwde gegevens.
name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)Hoe injectie eruitziet
Stel je een schadelijke waarde voor. Door deze samen te voegen verandert de betekenis van de query volledig.
name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')Placeholders bieden uitkomst
De veilige manier is het gebruik van geparametriseerde query's. Gebruik ? als placeholder en geef de waarden door als een tuple. Het stuurprogramma ontsnapt aan deze waarden op een veilige manier.
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()Meerdere placeholders
Gebruik één ? per waarde. Geef ze door in een tuple, in dezelfde volgorde als waarin ze voorkomen.
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()Tupels met één waarde
Een tuple met één element heeft een afsluitende komma nodig: ('Alice',). Zonder die komma behandelt Python de haakjes alleen als groepering.
good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))Poging tot injectie geblokkeerd
Met placeholders wordt een schadelijke waarde behandeld als gewone gegevens, niet als SQL. De waarde levert eenvoudigweg geen overeenkomsten op.
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()Benoemde placeholders
SQLite ondersteunt ook benoemde placeholders met de syntaxis :name. Geef een woordenboek met waarden door.
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()Parameters in WHERE
Placeholders werken in elke clausule die een waarde accepteert, ook in 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
Gebruik executemany() met een lijst tupels om veel rijen in te voegen. Dit is sneller en blijft veilig.
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()Placeholders zijn niet voor identificaties
Placeholders werken alleen voor waarden, niet voor tabel- of kolomnamen. Die moeten in je eigen code afkomstig zijn uit een vertrouwde lijst met toegestane waarden.
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()Een herbruikbare invoegfunctie
Door geparametriseerde invoegbewerkingen in een functie te plaatsen, blijft je code overzichtelijk en consequent veilig.
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()Korte controle
Test je kennis van veilige query's.
Samenvatting
Je hebt geleerd hoe je veilige query's schrijft die beschermd zijn tegen injectie.
- Voeg nooit niet-vertrouwde invoer samen met SQL
- Gebruik
?-placeholders met een tuple met waarden - Benoemde
:name-placeholders accepteren een woordenboek executemany()voegt veel rijen veilig in- Placeholders zijn voor waarden, niet voor identificaties
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “Geparametriseerde queries” gratis?
Ja — de volledige tekst van “Geparametriseerde queries” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “Geparametriseerde queries”?
Voorkom SQL-injectie Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Geparametriseerde queries”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Python Academy?
Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Verbinding maken en tabellen maken
- Insert, Select, Update, Delete
- Geparametriseerde queries
- Transacties en contextmanagers