Ga naar hoofdinhoud

Invoer controleren: in de praktijk

Met de grenzen in Form en je eigen controles uit les 2 tot en met 5 bewaak je één formulier. Een echte site doet dat overal, en op een vaste manier.

Toestaan wat mag, niet weren wat niet mag​

Er zijn twee manieren om invoer te controleren. Je kunt opsommen wat níét mag, of opsommen wat wél mag. Het tweede is veiliger.

Neem een gebruikersnaam. Weren wat niet mag ("geen <, geen spaties, geen ;…") laat altijd iets door dat je niet bedacht had. Toestaan wat mag ("alleen letters en cijfers, 3 tot 20 tekens") laat precies dat door en de rest niet. Wat je vergeet te noemen, is dan geweigerd in plaats van toegestaan. Dat is hetzelfde idee als de lijst met stemmingen uit les 5, en als deny by default uit Wie mag wat.

Een grens op de grootte van een verzoek​

max_length bewaakt één veld. Starlette, het deel van FastAPI dat formulieren leest, weigert zelf al een veld boven een megabyte; dat zag je in les 1. Een verzoek kan ook op andere manieren groot zijn: een enorm geüpload bestand, of duizend velden tegelijk. Daar zet je een grens omheen die vóór je code komt. Dat regel je meestal niet in FastAPI zelf, maar in de server ervoor, zoals nginx uit Te veel verzoeken:

client_max_body_size 1m;

Alles groter dan een megabyte weigert nginx dan, voordat het je server bereikt.

Een 422 zegt genoeg​

FastAPI stuurt bij een te lang of ontbrekend veld een 422 met daarin welk veld het was en waarom. Dat is genoeg: de afzender weet wat hij moet aanpassen, en je verraadt niets gevoeligs. Bouw zelf geen uitgebreide foutmeldingen die bijvoorbeeld tonen wat er wél in de database staat.

Opdracht: welke aanpak past?​

Kies bij elke situatie de aanpak uit deze reeks die past.

  1. Een veld voor een leeftijd krijgt de tekst honderd binnen.
  2. Iemand uploadt een bestand van 2 gigabyte naar je server.
  3. Je wilt een gebruikersnaam toestaan, maar geen rare tekens.
Antwoord
  1. Type in de parameter: leeftijd: int = Form(...). FastAPI weigert honderd dan met een 422, net als het cijfer in les 5. Met ge en le zet je er ook een onder- en bovengrens op.
  2. Een grens op de grootte van het verzoek, in de server vóór FastAPI.
  3. Toestaan wat mag: alleen letters en cijfers, met een minimum- en maximumlengte.

Terug naar les 1, het begin van deze reeks over invoer.