Security Les 2: CSRF

Wat hebben we vorige les besproken?
1 / 44
volgende
Slide 1: Woordweb
Applicatie- en mediaontwikkelaarMBOStudiejaar 3

In deze les zitten 44 slides, met interactieve quizzen en tekstslides.

time-iconLesduur is: 200 min

Onderdelen in deze les

Wat hebben we vorige les besproken?

Slide 1 - Woordweb

Python intro
Programming basics-II
Les 3 / Week 7a
Security: XSS, CSRF, SQL Injectie
Delta
Les 2 / 3 over Security

Slide 2 - Tekstslide

🪧Deze lessen
Les 1: 
  • Inleiding
  • XSS

Ondanks dat we veel op WEB security focussen, zijn de concepten ook voor NATIVE relevant.
Les 2:
  • CSRF
Les 3
  • SQL Injectie

Slide 3 - Tekstslide

Waarom moet je cookies in jouw browser nooit delen of verliezen aan hackers?

Slide 4 - Open vraag

Waar staat de X voor in XSS?
A
XML
B
XAML
C
Cross
D
Cheat

Slide 5 - Quizvraag

Slide 6 - Tekstslide

Hoe voorkomen dat hackers XSS uitvoeren op onze website?

Slide 7 - Open vraag

Output Encoding / Escaping

Slide 8 - Tekstslide

Zie moduleboek







Lees de theorie na en maak opdracht 6.6 t/m 6.10 voor jezelf
Dit was de opdracht vorige week. Al klaar?

Slide 9 - Tekstslide

State & Sessies
HTTP is stateless... Hoe onthouden we dan wie ingelogd is?

Slide 10 - Tekstslide

State & Sessies
HTTP heeft geen geheugen. Elke request staat op zichzelf.

Toch willen we bijhouden:
  • Wie is ingelogd?
  • Wat zit er in het winkelmandje?
  • Welke rol heeft de gebruiker?

Slide 11 - Tekstslide



  1. Gebruiker logt in
  2. Server maakt sessie aan met uniek ID (bijv. iqh4wj6jha2wSwsr8)
  3. Dat ID wordt in een cookie naar de browser gestuurd
  4. Bij elke volgende request stuurt de browser de cookie automatisch mee
  5. Server kijkt: welke sessie hoort bij dit ID?
  6. Stuurt een pagina terug voor de gebruiker met die sessie ID
State & Sessies

Slide 12 - Tekstslide

State & Sessies
Omdat onze session id bewijst wie we zijn, moeten we die beschermen. Met XSS zou die session id cookie gestolen kunnen worden.

Maar ook CSRF is een aanval om rekening mee te houden

Slide 13 - Tekstslide

Wat is CSRF?
Cross-Site Request Forgery

Een aanvaller laat een ingelogde gebruiker onbewust een actie uitvoeren op een website waar die gebruiker al is ingelogd.

Slide 14 - Tekstslide

Voorbeeld CSRF
  1. Jij bent ingelogd op https://mijnbank.nl (tabblad A)
  2. Je bezoekt https://slechte-site.com (tabblad B)
  3. Die site bevat een verborgen formulier dat automatisch verstuurt:





  4. De browser stuurt jouw sessiecookie van de bank automatisch mee
  5. De bank denkt: dit is een geldige, ingelogde gebruiker → actie uitgevoerd

Slide 15 - Tekstslide

CSRF




Kernmechanisme:
De browser stuurt automatisch cookies mee — ook als het verzoek van een andere website komt.

Slide 16 - Tekstslide

CSRF ↔️ Sessies
Browsers sturen automatisch alle cookies mee die horen bij het domein waarnaar het verzoek gaat, ongeacht van welke site het verzoek afkomstig is. 
Dus als jij naar https://google.com navigeert, zoekt jouw browser de google.com cookies erbij en stuurt die mee met jouw verzoek.

Een kwaadaardige site stuurt een verzoek naar de bank, en de browser voegt de bankcookie automatisch toe. Dus het verzoek lijkt van de ingelogde gebruiker te komen

Slide 17 - Tekstslide

Wanneer is CSRF mogelijk?
De vier voorwaarden voor een succesvolle CSRF-aanval:

  1. De gebruiker is ingelogd op de doelsite
  2. De browser stuurt sessiecookies automatisch mee (is altijd waar)
  3. Er bestaat een gevoelige actie (POST naar /change-email, /delete-account)
  4. Die actie is niet extra beveiligd (geen 'csrf-token', geen bevestiging)

Slide 18 - Tekstslide

Is deze actie kwetsbaar voor CSRF als er geen bescherming is? (De gebruiker is ingelogd)
Sleep naar Ja of Nee.
Ja
Nee
GET /profiel tonen
POST /change-email
POST /geld-overmaken
POST /make-admin
GET /zoeken?q=laptop
POST /wachtwoord-wijzigen
POST /delete-account
GET /admin list tonen

Slide 19 - Sleepvraag

Verdediging: CSRF-tokens





In plaats van forms zomaar te accepteren als legitiem, willen we ze op een of andere manier markeren met iets wat alleen de échte website weet. Zodat hackers geen forms kunnen namaken.

Slide 20 - Tekstslide

Verdediging: CSRF-tokens
Hoe werkt het?
  1. Server genereert een willekeurig, geheim token en slaat dat op in de sessie
  2. Token wordt als verborgen veld meegestuurd in elk formulier:



  3. Bij verwerking van het formulier controleert de server:


  4. Klopt het niet → request geweigerd (419 Page Expired)
  • Zit er een csrf_token in de request?
  • Komt die overeen met het token in de sessie?

Slide 21 - Tekstslide

Hoe voeg je in Laravel een CSRF-token toe aan een formulier?

Slide 22 - Woordweb

Verdediging: CSRF-tokens

Slide 23 - Tekstslide

Zie moduleboek







Lees de theorie (7.5 bevat aanvullende theorie)
Maak opdracht 7.6 t/m 7.10 voor jezelf

Slide 24 - Tekstslide

SQL Injection
SQL Injection is een kwetsbaarheid waarbij een aanvaller eigen SQL-code laat uitvoeren binnen een databasequery van jouw applicatie.

Slide 25 - Tekstslide

SQL Injection
Dit ontstaat wanneer:
  • Gebruikersinput direct "geplakt" wordt in een SQL-query
  • Er geen scheiding is tussen SQL-code en data





→ Dit geeft alle gebruikers terug. De aanvaller is ingelogd.

Slide 26 - Tekstslide

SQL Injection
Stel dat de delete functie werkt via delete.php?id=1

Bedenk een kwaadaardige invoer voor het volgende formulierveld dat alle orders uit de tabel verwijdert:


delete.php?id=

Slide 27 - Tekstslide

SQL Injection


delete.php?id=1 OR 1=1
→ resulteert in DELETE FROM orders WHERE id = 1 OR 1=1
Dit verwijdert alle orders omdat 1=1 altijd waar is.

Slide 28 - Tekstslide

SQL Injection


delete.php?id=1; DROP TABLE orders
Deze alternatieve aanval zou ook kunnen werken, maar dan moeten meerdere verschillende queries (DELETE + DROP) in één opdracht worden toegestaan door zowel PHP als MySQL (wat tegenwoordig niet standaard ingesteld staat)

Slide 29 - Tekstslide

Verdediging: Prepared Statements
De oplossing tegen SQL Injection: prepared statements

Slide 30 - Tekstslide

Verdediging: Prepared Statements
Het idee:
  • SQL-structuur wordt vooraf naar de database gestuurd
  • Data (parameters) worden apart meegegeven
  • De database behandelt parameters altijd als data, nooit als SQL-code

Veilig voorbeeld (PHP met PDO):

Slide 31 - Tekstslide

Verdediging: Prepared Statements








Zelfs als $username de waarde ' OR '1' = '1 bevat, blijft de query veilig. De invoer wordt nooit als SQL geïnterpreteerd.

Slide 32 - Tekstslide

ORMs helpen, maar omzeil ze niet!
Frameworks zoals Laravel (Eloquent), Doctrine en Hibernate gebruiken intern prepared statements.

Veilig (je gebruikt Eloquent ORM):



Gevaarlijk (raw query zonder binding):

Slide 33 - Tekstslide

Wachtwoorden & gevoelige data
Data = gegevens

Slide 34 - Tekstslide

Wachtwoorden opslaan

Slide 35 - Woordweb

Wachtwoorden & gevoelige data

Slide 36 - Tekstslide

Gevoelige data
  • Sla alleen op wat écht nodig is
  • Sla alleen op wat je mag opslaan (BSN mag niet zomaar [link])
  • Overweeg versleuteling voor gevoelige gegevens (BSN, betaalgegevens)
  • Beperk wie er bij kan (least privilege)
⚠️ True story: Er zijn bedrijven waarvan logs gehackt zijn. Wachtwoorden stonden er in plain text in omdat een developer var_dump($user) had laten staan.

Slide 37 - Tekstslide

Een collega zegt: "Ik doe inputvalidatie op het wachtwoordveld, dan heb ik geen prepared statement nodig." Wat antwoord je?
A
Hij heeft gelijk, inputvalidatie is voldoende
B
Hij heeft ongelijk, inputvalidatie vervangt prepared statements niet
C
Hij heeft gelijk als hij ook output encoding toepast
D
Hij heeft gelijk als de database MySQL is

Slide 38 - Quizvraag

Zie moduleboek







Lees de theorie (8.6 + 8.8 bevatten aanvullende theorie)
Maak opdracht 8.10 t/m 8.13 voor jezelf

Slide 39 - Tekstslide

Alles samen: 'defense in depth' in de praktijk
Gebruikersinvoer komt binnen
[ Inputvalidatie ]
Klopt het formaat? Is het verwacht?
[ Prepared statement ]
Query structuur gescheiden van data
[ Least privilege DB-gebruiker ] 
Beperkte rechten bij schade
[ Output encoding ]
Veilig tonen in de browser
[ Fail secure foutmeldingen ]
Geen technische details naar buiten
[ Logging ] 
Detecteren van verdacht gedrag

Slide 40 - Tekstslide

Afsluiting Security Lessen
Les 1:
  • Fundament: begrippenkader, basisprincipes
  • XSS: hoe het werkt, drie varianten
  • Inputvalidatie vs. output encoding

Les 2:
  • State, sessies en cookies
  • CSRF: hoe het werkt, verdediging met tokens en SameSite
  • Sessiebeveiliging: HttpOnly, Secure, time-outs
  • SQL Injection: hoe het ontstaat, prepared statements, least privilege

Slide 41 - Tekstslide

Welke combinatie van maatregelen beschermt het beste tegen zowel XSS als SQL Injection?
A
Inputvalidatie alleen
B
Output encoding en een sterk wachtwoord
C
HTTPS en CSRF-tokens
D
Inputvalidatie + output encoding + prepared statements

Slide 42 - Quizvraag

Security is geen afvinklijstje, het is een houding
Het landschap verandert voortdurend. Nieuwe frameworks, nieuwe aanvalstechnieken, nieuwe kwetsbaarheden. Wat vandaag veilig is, kan morgen een bekend lek zijn.

Slide 43 - Tekstslide

Security is geen afvinklijstje, het is een houding
Hoe blijf je actueel?
📰 Volg de OWASP-website: owasp.org publiceert continu guides, checklists en updates over nieuwe risico's
📬 Abonneer je op een security-nieuwsbrief: bijv. tldrsec.com, kort, wekelijks, praktisch
🐛 Volg CVE-meldingen: cve.org registreert bekende kwetsbaarheden in software die jij misschien gebruikt
🔔 Houd je dependencies bij: tools zoals npm audit of composer audit waarschuwen je als een pakket dat jij gebruikt een bekend lek heeft
🎯 Doe mee aan CTF-uitdagingen: Capture The Flag-competities (bijv. via picoctf.org of hackthebox.com) leren je aanvallen begrijpen door ze zelf uit te voeren in een veilige omgeving
💬 Praat erover met collega's en medestudenten: security-awareness groeit het snelst in een team dat het normaal vindt om elkaar te wijzen op risico's

Slide 44 - Tekstslide