Veiligheid: zo werkt deze route
Je gastenboek werkt. Zolang jij de enige bezoeker bent, gaat alles goed, want je gebruikt je eigen formulier zoals het bedoeld is. Deze route gaat over de bezoeker die dat niet doet: die typt iets wat je niet verwachtte, verstuurt een verzoek zonder je formulier, of vraagt iets wat niet van hem is.
Het ene idee
Alle reeksen komen neer op één regel, die je al kent uit Server of browser?:
Wat van de bezoeker komt, vertrouw je niet. De controle hoort op de server.
Een formulier, een verborgen knop, een cookie en een getal in het adres komen allemaal van de computer van de bezoeker, en daar heb je niets over te zeggen. Elke reeks laat één plek zien waar dat misgaat, en hoe je server het tegenhoudt.
Wat je al moet kunnen
De route bouwt op de FastAPI-lessen tot en met Jouw project: formulieren, de database, templates, htmx, cookies en sessies. Heb je die gedaan, dan heb je ook een gastenboek om te beschermen.
De spelregel
In deze route doe je een zwakheid eerst zelf na, klein en op je eigen computer.
Stuur zulke verzoeken uitsluitend naar je eigen server op 127.0.0.1, en
kijk alleen in je eigen database. Hetzelfde doen bij de site van een ander is
een aanval, en strafbaar, ook als het "maar een testje" is.
De route
Begin met Een script als bezoeker: daarin leer je verzoeken sturen zonder browser, en dat heb je in elke reeks nodig. Daarna volgen de reeksen, van dichtbij je eigen gastenboek naar ver weg:
| Reeks | De vraag die hij beantwoordt |
|---|---|
| Invoer controleren | Hoe houd je tegen wat niet in een veld hoort, als maxlength dat niet doet? |
| HTML van een bezoeker | Wat gebeurt er als een bezoeker HTML in je gastenboek typt? |
| Wie mag wat | Hoe zorg je dat alleen de schrijver zijn bericht kan verwijderen? |
| Cookies afschermen | Hoe houd je een script weg bij het sessie-id? |
| Wachtwoorden veilig opslaan | Hoe bewaar je wachtwoorden zo dat een gelekte database ze niet weggeeft? |
| Te veel verzoeken | Wat doe je tegen een bezoeker die je server blijft bestoken? |
Elke reeks begint met de zwakheid, gaat dan naar de verdediging in FastAPI, laat je die toepassen op je eigen project, en eindigt met wat echte sites nog meer doen. De route sluit af met Beveilig je eigen project, één lijst om je project na te lopen. Je kunt de reeksen ook los doen, maar Cookies bouwt op de server uit Wie mag wat.
Statuscodes
Een statuscode zegt in één getal hoe een verzoek afliep. In deze route kom je deze tegen:
| Code | Betekent | Wie stuurt hem | Waar je hem ziet |
|---|---|---|---|
200 | gelukt | je endpoint, als alles goed gaat | overal |
400 | dit verzoek klopt niet | jij, met HTTPException, voor een regel die je zelf bedacht | Invoer, les 4 |
403 | dit mag jij niet | jij, als de bezoeker iets van een ander wil | Wie mag wat, les 2 |
404 | bestaat niet | FastAPI bij een onbekend pad, of jij bij een onbekend item | Detailpagina |
422 | een veld past niet bij Form | FastAPI zelf, voordat je functie draait | Invoer, les 2 en 3 |
429 | te veel verzoeken | slowapi, je verzoeklimiet | Te veel verzoeken, les 4 |
500 | er ging iets mis in de server | niemand bewust: een fout in je code | de terminal van je server |
Begint een code met een 4, dan ligt het aan het verzoek. Begint hij met een 5,
dan ligt het aan je server. Bij een 500 staat de echte foutmelding
altijd in de terminal waarin je server draait.
Woorden
In de lessen staat eerst wat iets is, en daarna pas hoe het heet. De naam heb je nodig als je er later zelf iets over opzoekt; veel namen zijn Engels.
| Woord | Betekent | Waar |
|---|---|---|
| zwakheid | een plek waar je server iets toelaat wat niet de bedoeling is | overal |
| escapen | van < een < maken, zodat de browser tekst toont in plaats van HTML | XSS |
| XSS, cross-site scripting | HTML of een script van een bezoeker dat in de browser van een ander draait | XSS |
| broken access control, IDOR | een endpoint dat niet controleert wie iets vraagt | Wie mag wat |
httponly | een instelling van een cookie: scripts mogen hem niet lezen | Cookies |
| CSRF, cross-site request forgery | een andere site laat jouw browser iets doen op een site waar je bent ingelogd | Cookies |
| hash | een code die je van een wachtwoord maakt en niet kunt terugrekenen | Wachtwoorden |
| zout, salt | een willekeurig stukje tekst per wachtwoord, zodat gelijke wachtwoorden verschillende hashes krijgen | Wachtwoorden |
| DoS, DDoS | een server zo druk maken dat echte bezoekers geen antwoord krijgen, door één of door heel veel computers | Te veel verzoeken |
| verzoeklimiet, rate limit | een grens op het aantal verzoeken per bezoeker | Te veel verzoeken |
| CVD | een gat netjes melden bij de eigenaar van een site | Wie mag wat |
Door naar Een script als bezoeker.