Übung: SQL-Injection in der Item-Suche #2

Open
opened 2026-11-02 11:37:45 +00:00 by trainer · 0 comments
Owner

Übung: SQL-Injection in der Item-Suche

Branch: exercise/sql-injection · Schwierigkeit: mittel ·
Thema: Security (Python)

Ausgangslage

Ein neues Feature ergänzt eine Suche über die eigenen Items:
GET /api/v1/items/search?q=… in backend/app/api/routes/items.py.
Es gibt sogar einen neuen Test (test_search_items) — und der ist grün.
Trotzdem hat die Umsetzung ein gravierendes Security-Problem.

Aufgabe

  1. PR von exercise/sql-injection auf main öffnen.
  2. Die Problemstelle finden und einordnen (OWASP: Injection).
    Hinweis: Raw-SQL, Nutzereingabe, f-String.
  3. Exploit-Wert für q formulieren, der Items aller Nutzer liefert
    (z. B. ' OR 1=1 --). Was bedeutet das zusätzlich für die
    Berechtigungsprüfung?
  4. Fix vorschlagen: die Abfrage mit SQLModel formulieren
    (select(Item).where(Item.owner_id == current_user.id, col(Item.title).ilike(f"%{q}%"))) — oder gebundene Parameter
    (text(...).bindparams(...)).
  5. Einen Test ergänzen, der den Exploit-Wert schickt und prüft, dass
    keine fremden Items zurückkommen.
  6. Review-Agenten laufen lassen, Findings abarbeiten. Merge erst nach
    Freigabe durch den Trainer.

Erwartetes Learning

  • Grüne Tests beweisen das Happy Path, nicht die Sicherheit
  • Warum String-Bau in SQL gefährlich ist — auch wenn ein ORM im Projekt ist
  • Wie ein Review-Agent Finding → Fix → Verifikation begleitet
# Übung: SQL-Injection in der Item-Suche **Branch:** `exercise/sql-injection` · **Schwierigkeit:** mittel · **Thema:** Security (Python) ## Ausgangslage Ein neues Feature ergänzt eine Suche über die eigenen Items: `GET /api/v1/items/search?q=…` in `backend/app/api/routes/items.py`. Es gibt sogar einen neuen Test (`test_search_items`) — und der ist grün. Trotzdem hat die Umsetzung ein gravierendes Security-Problem. ## Aufgabe 1. PR von `exercise/sql-injection` auf `main` öffnen. 2. Die Problemstelle finden und einordnen (OWASP: *Injection*). Hinweis: Raw-SQL, Nutzereingabe, f-String. 3. Exploit-Wert für `q` formulieren, der Items **aller** Nutzer liefert (z. B. `' OR 1=1 --`). Was bedeutet das zusätzlich für die Berechtigungsprüfung? 4. Fix vorschlagen: die Abfrage mit SQLModel formulieren (`select(Item).where(Item.owner_id == current_user.id, col(Item.title).ilike(f"%{q}%"))`) — oder gebundene Parameter (`text(...).bindparams(...)`). 5. Einen Test ergänzen, der den Exploit-Wert schickt und prüft, dass keine fremden Items zurückkommen. 6. Review-Agenten laufen lassen, Findings abarbeiten. Merge erst nach Freigabe durch den Trainer. ## Erwartetes Learning - Grüne Tests beweisen das Happy Path, nicht die Sicherheit - Warum String-Bau in SQL gefährlich ist — auch wenn ein ORM im Projekt ist - Wie ein Review-Agent Finding → Fix → Verifikation begleitet
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
lab/full-stack-fastapi#2
No description provided.