In een wereld waar cyberbeveiliging steeds belangrijker wordt, is het implementeren van een robuust authenticatiesysteem essentieel. Een van de krachtigste manieren om de beveiliging van gebruikersaccounts te verbeteren, is door tweefactorauthenticatie (2FA) toe te voegen. In deze paragraaf wordt uitgelegd hoe je een veilige inlogmethode kunt implementeren door gebruik te maken van een combinatie van wachtwoordverificatie en 2FA, waarbij strikte limieten worden ingesteld om brute-force aanvallen te voorkomen.
Wanneer een gebruiker probeert in te loggen, wordt eerst gecontroleerd of het account tijdelijk is vergrendeld. Dit gebeurt door de waarde van lockout_until te vergelijken met de huidige datum en tijd. Als het account tijdelijk is vergrendeld, ontvangt de gebruiker een foutmelding die aangeeft dat het account is vergrendeld en dat er later geprobeerd kan worden in te loggen. Deze beveiliging helpt voorkomen dat kwaadwillenden door blijven proberen in te loggen met foutieve gegevens.
Als de gebruiker geen vergrendeld account heeft, wordt de ingevoerde wachtwoord gecontroleerd tegen het versleutelde wachtwoord van de gebruiker. Wanneer het ingevoerde wachtwoord niet overeenkomt met het opgeslagen wachtwoord, wordt een foutmelding gegenereerd waarin wordt aangegeven dat de inloggegevens ongeldig zijn. Dit mechanisme zorgt ervoor dat de toegang tot het account enkel mogelijk is voor gebruikers die over de juiste inloggegevens beschikken.
Wanneer 2FA is ingeschakeld, moet de gebruiker ook een tijdelijke eenmalige wachtwoordcode (TOTP) invoeren, die via een authenticator-app wordt gegenereerd. Het systeem maakt gebruik van de pyotp bibliotheek om de ingevoerde code te verifiëren. Als de code niet correct is, worden er pogingen geteld en wanneer er vijf mislukte pogingen worden gedaan, wordt het account tijdelijk vergrendeld voor een periode van tien minuten. Dit voorkomt dat aanvallers blijven proberen verschillende codes in te voeren zonder succes. Na het vergrendelen van het account, wordt de gebruiker geïnformeerd dat het account voor de komende tien minuten niet toegankelijk is.
Als de gebruiker de correcte TOTP-code invoert, worden de mislukte pogingen gereset en wordt de vergrendeling opgeheven, waardoor de gebruiker veilig toegang kan krijgen tot het systeem. Vervolgens wordt een JWT (JSON Web Token) gegenereerd en aan de gebruiker verstrekt, waarmee toegang wordt verleend tot de beschermde API’s.
Bij de implementatie van 2FA is het belangrijk te begrijpen dat de extra beveiliging die het biedt, alleen effectief is als de TOTP-code goed wordt beheerd. Het geheim dat voor de TOTP wordt gebruikt, moet veilig worden opgeslagen en nooit in de code zelf hardcoded staan. Het aanbieden van een hersteloptie voor wanneer gebruikers hun authenticator-app verliezen, is een ander belangrijk aspect van gebruikersvriendelijke 2FA-implementatie.
Deze stapsgewijze aanpak zorgt ervoor dat het inlogproces niet alleen veilig is, maar ook gebruiksvriendelijk. Het combineren van meerdere beveiligingslagen helpt bij het beschermen van de gebruikersaccounts en vermindert de kans op misbruik. Het is echter van belang om ook na te denken over het gebruikersgemak en ervoor te zorgen dat de beveiliging de gebruikerservaring niet onterecht bemoeilijkt.
Naast de technische aspecten van de 2FA-implementatie, moeten er duidelijke instructies en ondersteuningssystemen zijn voor gebruikers die mogelijk problemen ondervinden bij het instellen of gebruiken van 2FA. Het bieden van gebruikershandleidingen, FAQ’s, en een helpdesk is cruciaal om ervoor te zorgen dat de extra beveiligingslagen geen frustratie bij de eindgebruiker veroorzaken.
Hoe bescherm je je API tegen CSRF-aanvallen en stel je CORS-beleid in?
Het beveiligen van een webapplicatie tegen CSRF (Cross-Site Request Forgery) en het juist configureren van CORS (Cross-Origin Resource Sharing) zijn cruciale stappen voor het beschermen van zowel de server als de gegevens van de gebruiker. In deze sectie worden de belangrijkste concepten en implementaties voor CSRF-bescherming en CORS-beheer besproken, met een specifieke focus op de integratie in een FastAPI-applicatie.
Wanneer je werkt met state-changing HTTP-verzoeken, zoals POST, PUT, PATCH en DELETE, is het essentieel om een CSRF-token te gebruiken. Dit token beschermt tegen aanvallen waarbij een kwaadwillende gebruiker verzoeken uit kan voeren vanuit een andere site namens een geauthenticeerde gebruiker. De werking van CSRF-bescherming is gebaseerd op het idee dat de client bij elke staat-veranderende aanvraag een geldig token moet leveren. Dit token wordt door de server gegenereerd en aan de client doorgegeven, vaak via een cookie of in een antwoordheader. De client moet dit token vervolgens meesturen bij elke beschermde aanvraag, bijvoorbeeld als een header (bijv. X-CSRF-Token). De server valideert dit token tegen de sessie of ondertekende gegevens.
In een FastAPI-toepassing kan CSRF-bescherming eenvoudig worden geïmplementeerd met de juiste afhankelijkheden en configuraties. Bijvoorbeeld, bij een aanvraag naar de route /csrf-token kan een nieuw token gegenereerd worden, en voor de route /account/update moet het ontvangen CSRF-token gevalideerd worden voordat de gebruikersaccount wordt bijgewerkt.
Dit zorgt ervoor dat de client eerst een geldig token verkrijgt via de /csrf-token-endpoint en dit token meestuurt bij elke formulierupdate. Als het token ongeldig is of ontbreekt, wordt de aanvraag geweigerd.
Naast CSRF-bescherming speelt het CORS-beleid een belangrijke rol in het beperken van ongeautoriseerde toegang tot je API. CORS definieert welke webbronnen mogen communiceren met je API en onder welke voorwaarden. FastAPI biedt ingebouwde middleware voor gedetailleerde configuratie van CORS-beleid, zodat je enkel specifieke domeinen kunt toestaan voor API-toegang.
In het onderstaande voorbeeld wordt een CORS-configuratie opgesteld die enkel aanvragen toestaat van specifieke, vertrouwde domeinen en alleen de noodzakelijke HTTP-methoden en headers toelaat.
Met deze configuratie wordt ervoor gezorgd dat enkel vertrouwde domeinen toegang hebben tot de API en dat alleen de methoden en headers die noodzakelijk zijn voor de frontend-toepassing zijn toegestaan. Dit voorkomt dat andere, onbevoegde websites je API kunnen misbruiken.
Een belangrijk aspect van CORS is de zogenaamde "preflight" aanvraag, waarbij de browser een OPTIONS-verzoek verzendt voordat het werkelijke verzoek wordt verstuurd. Dit wordt gebruikt om te controleren of de server verzoeken van een specifiek domein met bepaalde methoden en headers accepteert. FastAPI’s middleware handelt deze preflight-aanvragen automatisch af. Bijvoorbeeld, een browser kan een OPTIONS-verzoek sturen naar /account/update, en als de server geen overeenkomende headers toestaat, wordt de werkelijke aanvraag geblokkeerd voordat deze de server bereikt.
Het testen van deze preflight-aanvragen kan gedaan worden via tools zoals curl of browserontwikkelaarstools. Zo kan je verifiëren of de juiste CORS-headers teruggegeven worden en of de verzoeken correct worden afgehandeld.
Voor een state-veranderend verzoek, zoals een POST-aanvraag naar /account/update, moeten zowel het CSRF-token als het CORS-beleid correct zijn geconfigureerd. Het CSRF-token moet worden gevalideerd door de server, en de aanvraag moet afkomstig zijn van een goedgekeurd CORS-domein. Als een van deze voorwaarden niet wordt vervuld, zal de server het verzoek blokkeren.
In productieomgevingen worden CSRF- en CORS-beleid meestal gecombineerd met andere beveiligingsmechanismen, zoals authenticatie-middleware, rate-limiting en logging. Deze zorgen voor een robuustere bescherming tegen aanvallen en ongeoorloofde toegang.
Daarnaast is het belangrijk om in de context van moderne webapplicaties aandacht te besteden aan Content Security Policy (CSP)-headers. CSP biedt een krachtige manier om te definiëren welke bronnen voor scripts, stijlen, afbeeldingen en andere inhoud vertrouwd zijn. Door alleen content van expliciet goedgekeurde bronnen toe te staan, kan je ernstige aanvallen zoals XSS (Cross-Site Scripting) voorkomen. Een strikte CSP-configuratie zou er bijvoorbeeld als volgt uit kunnen zien:
Deze configuratie zorgt ervoor dat alleen content van de eigen oorsprong ('self') wordt geladen, inline scripts en stijlen worden geblokkeerd, en geen externe plug-ins of frames zijn toegestaan.
Door de juiste CSRF- en CORS-beveiliging samen met een strikte CSP te implementeren, minimaliseer je het risico op aanvallen en verhoog je de veiligheid van je applicatie aanzienlijk.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский