Python Academy · leksjon

Parametriserte spørringer

Forhindre SQL-injeksjon

Leksjon 3 av 413 trinn

Parametriserte spørringer er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Faren ved å bygge strenger

Det er risikabelt å bygge SQL ved å sette sammen strenger. Hvis brukerdata inneholder SQL, kan de endre spørringen. Dette kalles SQL-injeksjon.

Gjør aldri dette med data De ikke stoler på.

name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)

Slik ser en injeksjon ut

Se for Dem en ondsinnet verdi. Når den settes sammen med resten, endres betydningen av spørringen fullstendig.

name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')

Plassholdere som løsning

Den sikre metoden er parameteriserte spørringer. Bruk ? som plassholder, og send verdiene som et tuppel. Driveren behandler dem på en trygg måte.

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()

Flere plassholdere

Bruk én ? per verdi. Send dem i et tuppel i samme rekkefølge som de forekommer.

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()

Tupler med én verdi

Et tuppel med ett element trenger et avsluttende komma: ('Alice',). Uten kommaet behandler Python parentesene som ren gruppering.

good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))

Injeksjonsforsøk blokkert

Med plassholdere behandles en ondsinnet verdi som vanlige data, ikke som SQL. Den gir ganske enkelt ingen treff.

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()

Navngitte plassholdere

SQLite støtter også navngitte plassholdere med syntaksen :name. Send en ordbok med verdier.

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()

Parametere i WHERE

Plassholdere fungerer i alle ledd som tar imot en verdi, inkludert 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

For å sette inn mange rader bruker De executemany() med en liste over tupler. Det er raskere og fortsatt sikkert.

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()

Plassholdere er ikke for identifikatorer

Plassholdere fungerer bare for verdier, ikke for tabell- eller kolonnenavn. Slike navn må komme fra en pålitelig hvitliste i Deres egen kode.

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()

En gjenbrukbar innsettingsfunksjon

Hvis parameteriserte innsettinger pakkes inn i en funksjon, blir koden ryddig og konsekvent sikker.

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()

Hurtigtest

Test kunnskapene Deres om sikre spørringer.

Oppsummering

De har lært å skrive spørringer som er sikre mot injeksjon.

  • Sett aldri inn data De ikke stoler på, i SQL ved å sette sammen strenger
  • Bruk ?-plassholdere med et tuppel av verdier
  • Navngitte :name-plassholdere tar imot en ordbok
  • executemany() setter inn mange rader på en sikker måte
  • Plassholdere er for verdier, ikke identifikatorer
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Parametriserte spørringer» gratis?

Ja – hele teksten i «Parametriserte spørringer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Parametriserte spørringer»?

Forhindre SQL-injeksjon Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Parametriserte spørringer»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Koble til og opprette tabeller
  2. Insert, Select, Update, Delete
  3. Parametriserte spørringer
  4. Transaksjoner og kontekstbehandlere
← Tilbake til Python Academy