Python Academy · Les

Geparametriseerde queries

Voorkom SQL-injectie

Les 3 van 413 stappen

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
Gratis beginnen

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

  1. Verbinding maken en tabellen maken
  2. Insert, Select, Update, Delete
  3. Geparametriseerde queries
  4. Transacties en contextmanagers
← Terug naar Python Academy