Skip to main content

Introductie

CSRF (Cross-Site Request Forgery) is een aanval waarbij een ingelogde gebruiker onbedoeld requests verstuurt terwijl de aanvaller zich als die gebruiker voordoet. Stel bijvoorbeeld dat je app een POST /user/email-endpoint heeft waarmee het e-mailadres gewijzigd kan worden. Als een aanvaller op een andere site een formulier plaatst dat automatisch naar deze URL verstuurt, kan het e-mailadres van de gebruiker gewijzigd worden zonder dat die het merkt. In Laravel 13 is CSRF-bescherming standaard ingeschakeld dankzij het mechanisme dat in de web-middlewaregroep zit.

CSRF-aanvallen voorkomen

De PreventRequestForgery-middleware van Laravel voorkomt CSRF met de volgende twee lagen:
  1. Origin-verificatie (de Sec-Fetch-Site-header)
  2. Tokenverificatie (een CSRF-token per sessie)
Eerst wordt de Origin gecontroleerd; als die niet te bepalen is of de controle mislukt, valt Laravel terug op tokenverificatie.

Origin-verificatie

Laravel controleert eerst Sec-Fetch-Site om te bepalen of het request van dezelfde Origin komt. Dit is vooral effectief in HTTPS-omgevingen. Als de Origin-verificatie slaagt, wordt het request op dat moment toegestaan. Slaagt die niet, dan wordt zoals voorheen de CSRF-tokenverificatie uitgevoerd.
Sec-Fetch-Site gaat uit van gebruik over HTTPS-verbindingen. In een HTTP-omgeving werkt Origin-verificatie niet en is tokenverificatie de belangrijkste verdediging.

Origin-only-modus

Je kunt de terugval op tokenverificatie ook uitschakelen en alleen op basis van Origin-verificatie beslissen.
In origin-only-modus geven requests waarvoor de Origin-verificatie mislukt een 403 terug in plaats van een 419. Als je same-site wilt toestaan, bijvoorbeeld voor requests tussen subdomeinen, stel je allowSameSite in.

Tokenverificatie

Laravel genereert per sessie een CSRF-token. Je kunt dit ophalen met csrf_token() of uit de sessie.
Wanneer je in web-routes formulieren maakt met POST, PUT, PATCH of DELETE, moet je altijd @csrf opnemen.

URI’s uitsluiten

Voor requests die van externe services komen, zoals webhooks van Stripe, kun je specifieke URI’s uitsluiten van CSRF-bescherming.
Plaats webhook-routes indien mogelijk buiten de web-middlewaregroep en houd het aantal uitsluitingen minimaal.

De X-CSRF-TOKEN-header

Laravel verifieert niet alleen het _token in formulieren, maar ook de X-CSRF-TOKEN-header. Zet het token eerst in een meta-tag:
Voeg die waarde daarna toe aan de header van AJAX-requests:

De X-XSRF-TOKEN-header

Laravel verstuurt ook een versleutelde XSRF-TOKEN-cookie. Axios en Angular kunnen deze waarde bij requests naar dezelfde Origin automatisch in de X-XSRF-TOKEN-header zetten. Daardoor is CSRF-bescherming in SPA- en AJAX-implementaties vaak actief zonder dat je de header handmatig hoeft in te stellen.

Aandachtspunten voor SPA’s

Als je Laravel als API-backend voor een SPA gebruikt, haal je eerst de CSRF-cookie op en verstuur je daarna het loginrequest.
Zie Sanctum voor meer details.
Laatst gewijzigd op 6 september 2026