In deze les zitten 28 slides, met interactieve quizzen en tekstslides.
Lesduur 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 3 / 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
SQL Injection
Slide 4 - Woordweb
SQL Injection
SQL Injection is een kwetsbaarheid waarbij een aanvaller eigen SQL-code laat uitvoeren binnen een databasequery van jouw applicatie.
Slide 5 - 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 6 - 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 7 - 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 8 - 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 9 - Tekstslide
Verdediging: Prepared Statements
De oplossing tegen SQL Injection: prepared statements
Slide 10 - 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 11 - 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 12 - Tekstslide
ORMs helpen, maar omzeil ze niet!
Frameworks zoals Laravel (Eloquent), Doctrine en Hibernate gebruiken intern prepared statements.
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 17 - 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 18 - Quizvraag
Injectie is breder dan SQL
Injectie-aanvallen zijn niet uniek aan SQL. Elke plek waar gebruikersinput in een commando of query terechtkomt zonder validatie is een risico.
Slide 19 - Tekstslide
Injectie is breder dan SQL
Andere kwetsbare voorbeelden: Command Injection
Attacker roept aan: ?host=google.com; cat /etc/passwd → Na de ping wordt een tweede commando uitgevoerd. Het /etc/passwd bestand op Linux bevat wachtwoorden!
Slide 20 - Tekstslide
Injectie is breder dan SQL
Andere kwetsbare voorbeelden: Path Traversal
Attacker roept aan: ?file=../../etc/passwd
$file wordt 'passwd'
Slide 21 - Tekstslide
Injectie is breder dan SQL
Bedenk:
Verwerk ik input van de gebruiker?
Wat gebeurt er met die input?
Hoe kan de gebruiker invloed uitoefenen?
Hoe maak ik de invoer onschadelijk? Wat kan ik allemaal uit de invoer 'escapen' / weghalen? Bestaan daarvoor functies/best-practices?
Zoek altijd online naar actueel en betrouwbaar advies! Vraag ook na bij, en leer van, Senior Developers op je werk.
Slide 22 - Tekstslide
Zie moduleboek
Lees de theorie (8.6 + 8.8 bevatten aanvullende theorie)
Maak opdracht 8.10 t/m 8.13 voor jezelf
Slide 23 - 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 24 - 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 25 - Tekstslide
Welke combinatie van maatregelen beschermt het beste tegen zowel XSS als SQL Injection?
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 27 - 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