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. Deed je de uitbreiding JavaScript, dan ken je hem al 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 hele FastAPI-route: de basis, met formulieren, de database en templates, plus de uitbreidingen htmx, JavaScript en cookies en sessies. Heb je die gedaan, dan heb je ook een gastenboek om te beschermen.
Met alleen de basis kun je al beginnen aan Invoer controleren. Waar die reeks naar Server of browser? verwijst, is dat een les uit de uitbreiding JavaScript die je later doet; de reeks is ook zonder die les te volgen. De reeks ervoor, Wat je server laat zien, geeft je een server met sessies kant-en-klaar; wat een sessie is, staat in Onthouden op de server: sessies.
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 het gereedschap: daarin leer je verzoeken sturen zonder browser, en dat heb je in elke reeks nodig. Daarna volgen de reeksen, van makkelijk naar moeilijk. Bij elke reeks staat de vraag die hij beantwoordt.
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. Je kunt de reeksen ook los doen, maar Cookies bouwt op de server uit Wie mag wat.
Wat je aan het eind hebt
Hetzelfde gastenboek, maar nu houdt je server zelf de grens bij. Hij zet geen lijst met zijn endpoints meer open, en je databases gaan niet mee in een zip of naar GitHub. Een bericht dat te lang is of leeg, weigert hij. HTML die een bezoeker typt, komt er als gewone tekst in. Alleen de schrijver kan zijn bericht verwijderen, ook als iemand het verzoek met een script in elkaar zet:
Verder kan geen script meer bij het sessie-id, staan wachtwoorden er als hash in, en remt een verzoeklimiet een bezoeker af die je server blijft bestoken. Beveilig je eigen project zet dat allemaal op één lijst.
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 | meestal jij, met HTTPException, voor een regel die je zelf bedacht; Starlette zelf bij een veld boven een megabyte | Invoer, les 2 en les 5 |
401 | je bent niet (goed) ingelogd | jij, met HTTPException, als een wachtwoord niet klopt of er geen sessie is | Inloggen: een wachtwoord controleren, Wie mag wat, les 1 |
403 | dit mag jij niet | jij, als de bezoeker iets van een ander wil | Wie mag wat, les 3 |
404 | bestaat niet | FastAPI bij een onbekend pad, of jij bij een onbekend item | Een 404 sturen: als het item niet bestaat, De handleiding uitzetten, Invoer, les 8 |
422 | een veld past niet bij Form | FastAPI zelf, voordat je functie draait | Invoer, les 3 en les 4 |
429 | te veel verzoeken | slowapi, je verzoeklimiet | Te veel verzoeken, les 5 |
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 |
| OpenAPI | de beschrijving van al je endpoints, die FastAPI zelf maakt en op /openapi.json en /docs zet | Wat je server laat zien: de handleiding op /docs |
| security through obscurity | iets verstoppen in plaats van afschermen; het houdt niemand tegen die het toch vindt | Wat je server laat zien: de handleiding uitzetten |
.gitignore | een bestand met de namen van bestanden en mappen die git overslaat | Wat je server laat zien: een .gitignore en een nette zip |
| path traversal | met .. in een bestandsnaam uit de map klimmen die je server bedoelde | Invoer |
| 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 |
| reflected XSS | XSS waarbij de HTML in een link zit en de server hem terugzet in de pagina, zonder iets op te slaan | XSS |
| DOM-XSS | XSS waarbij JavaScript in de browser de HTML in de pagina zet, bijvoorbeeld met innerHTML | XSS |
| broken access control, IDOR | een endpoint dat niet controleert wie iets vraagt | Wie mag wat: in de praktijk |
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 |
| CSRF-token | een geheime code in elk formulier, die een andere site niet kent | 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 |
| rainbow tables | vooraf uitgerekende lijsten met de hash van miljoenen bekende wachtwoorden; een zout maakt ze onbruikbaar | Wachtwoorden |
| Argon2 | een hash die expres traag is, gemaakt voor wachtwoorden | Wachtwoorden |
| peper | een geheim dat voor alle wachtwoorden hetzelfde is en níét in de database staat | Wachtwoorden |
| tweestapsverificatie | na het wachtwoord nog iets tweeds dat de gebruiker heeft, zoals een code uit een app | Wachtwoorden |
| AVG | de Europese privacywet: persoonsgegevens, zoals wachtwoorden, moet je passend beveiligen | Wachtwoorden |
| datalek | persoonsgegevens die bij iemand terechtkomen die ze niet mocht hebben; dat moet binnen 72 uur gemeld | Wachtwoorden |
| DoS, DDoS | een server zo druk maken dat echte bezoekers geen antwoord krijgen, door één of door heel veel computers | Te veel verzoeken: DoS en DDoS |
| verzoeklimiet, rate limit | een grens op het aantal verzoeken per bezoeker | Te veel verzoeken: een limiet met slowapi |
| CVD | een gat netjes melden bij de eigenaar van een site | Wie mag wat: in de praktijk |
Door naar Een script als bezoeker.