Ga naar hoofdinhoud

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​

Alleen je eigen server

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:

In de terminal probeert Alex met een script het bericht van Sara te verwijderen, en je server antwoordt met 403. In het gastenboek staat de HTML die Alex typte als gewone tekst, en heeft alleen je eigen bericht een verwijderknop.

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:

CodeBetekentWie stuurt hemWaar je hem ziet
200geluktje endpoint, als alles goed gaatoveral
400dit verzoek klopt nietmeestal jij, met HTTPException, voor een regel die je zelf bedacht; Starlette zelf bij een veld boven een megabyteInvoer, les 2 en les 5
401je bent niet (goed) ingelogdjij, met HTTPException, als een wachtwoord niet klopt of er geen sessie isInloggen: een wachtwoord controleren, Wie mag wat, les 1
403dit mag jij nietjij, als de bezoeker iets van een ander wilWie mag wat, les 3
404bestaat nietFastAPI bij een onbekend pad, of jij bij een onbekend itemEen 404 sturen: als het item niet bestaat, De handleiding uitzetten, Invoer, les 8
422een veld past niet bij FormFastAPI zelf, voordat je functie draaitInvoer, les 3 en les 4
429te veel verzoekenslowapi, je verzoeklimietTe veel verzoeken, les 5
500er ging iets mis in de serverniemand bewust: een fout in je codede 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.

WoordBetekentWaar
zwakheideen plek waar je server iets toelaat wat niet de bedoeling isoveral
OpenAPIde beschrijving van al je endpoints, die FastAPI zelf maakt en op /openapi.json en /docs zetWat je server laat zien: de handleiding op /docs
security through obscurityiets verstoppen in plaats van afschermen; het houdt niemand tegen die het toch vindtWat je server laat zien: de handleiding uitzetten
.gitignoreeen bestand met de namen van bestanden en mappen die git overslaatWat je server laat zien: een .gitignore en een nette zip
path traversalmet .. in een bestandsnaam uit de map klimmen die je server bedoeldeInvoer
escapenvan < een &lt; maken, zodat de browser tekst toont in plaats van HTMLXSS
XSS, cross-site scriptingHTML of een script van een bezoeker dat in de browser van een ander draaitXSS
reflected XSSXSS waarbij de HTML in een link zit en de server hem terugzet in de pagina, zonder iets op te slaanXSS
DOM-XSSXSS waarbij JavaScript in de browser de HTML in de pagina zet, bijvoorbeeld met innerHTMLXSS
broken access control, IDOReen endpoint dat niet controleert wie iets vraagtWie mag wat: in de praktijk
httponlyeen instelling van een cookie: scripts mogen hem niet lezenCookies
CSRF, cross-site request forgeryeen andere site laat jouw browser iets doen op een site waar je bent ingelogdCookies
CSRF-tokeneen geheime code in elk formulier, die een andere site niet kentCookies
hasheen code die je van een wachtwoord maakt en niet kunt terugrekenenWachtwoorden
zout, salteen willekeurig stukje tekst per wachtwoord, zodat gelijke wachtwoorden verschillende hashes krijgenWachtwoorden
rainbow tablesvooraf uitgerekende lijsten met de hash van miljoenen bekende wachtwoorden; een zout maakt ze onbruikbaarWachtwoorden
Argon2een hash die expres traag is, gemaakt voor wachtwoordenWachtwoorden
pepereen geheim dat voor alle wachtwoorden hetzelfde is en níét in de database staatWachtwoorden
tweestapsverificatiena het wachtwoord nog iets tweeds dat de gebruiker heeft, zoals een code uit een appWachtwoorden
AVGde Europese privacywet: persoonsgegevens, zoals wachtwoorden, moet je passend beveiligenWachtwoorden
datalekpersoonsgegevens die bij iemand terechtkomen die ze niet mocht hebben; dat moet binnen 72 uur gemeldWachtwoorden
DoS, DDoSeen server zo druk maken dat echte bezoekers geen antwoord krijgen, door één of door heel veel computersTe veel verzoeken: DoS en DDoS
verzoeklimiet, rate limiteen grens op het aantal verzoeken per bezoekerTe veel verzoeken: een limiet met slowapi
CVDeen gat netjes melden bij de eigenaar van een siteWie mag wat: in de praktijk

Door naar Een script als bezoeker.