- Inleiding
- Voorkomen van CSRF-verzoeken
- URI’s uitsluiten
- X-CSRF-Token
- X-XSRF-Token
Inleiding
Cross-site request forgeries zijn een vorm van kwaadwillig misbruik waarbij niet-geautoriseerde opdrachten worden uitgevoerd in naam van een geauthenticeerde gebruiker. Gelukkig maakt Laravel het eenvoudig om uw applicatie te beschermen tegen cross-site request forgery (CSRF) aanvallen.
Een uitleg van de kwetsbaarheid
In het geval dat u niet bekend bent met cross-site request forgeries, laten we een voorbeeld bespreken van hoe deze kwetsbaarheid kan worden misbruikt. Stel dat uw applicatie een /user/email
route heeft die een POST
verzoek accepteert om het email adres van de geauthenticeerde gebruiker te wijzigen. Hoogstwaarschijnlijk verwacht deze route een email
input veld om het email adres te bevatten dat de gebruiker wil gaan gebruiken.
Zonder CSRF-bescherming zou een kwaadwillende website een HTML-formulier kunnen maken dat naar de /user/email
-route van uw toepassing wijst en het eigen e-mailadres van de kwaadwillende gebruiker verzendt:
<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>
Als de kwaadwillende website het formulier automatisch verzendt wanneer de pagina wordt geladen, hoeft de kwaadwillende gebruiker alleen maar een nietsvermoedende gebruiker van uw toepassing te lokken om hun website te bezoeken en zijn e-mailadres zal in uw toepassing worden gewijzigd.
Om deze kwetsbaarheid te voorkomen, moeten we elk inkomend POST
, PUT
, PATCH
, of DELETE
verzoek inspecteren op een geheime sessiewaarde waartoe de kwaadwillende applicatie geen toegang heeft.
Voorkomen van CSRF Verzoeken
Laravel genereert automatisch een CSRF “token” voor elke actieve gebruikerssessie die door de applicatie wordt beheerd. Dit token wordt gebruikt om te verifiëren dat de geauthenticeerde gebruiker de persoon is die daadwerkelijk verzoeken indient bij de applicatie. Aangezien dit token wordt opgeslagen in de sessie van de gebruiker en elke keer dat de sessie wordt geregenereerd verandert, is een kwaadwillende applicatie niet in staat om toegang te krijgen.
Het CSRF-token van de huidige sessie kan worden benaderd via de sessie van het verzoek of via de csrf_token
helperfunctie:
use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});
Altijd dat u een HTML-formulier in uw applicatie definieert, moet u een verborgen CSRF _token
-veld in het formulier opnemen, zodat de CSRF-bescherming middleware het verzoek kan valideren. Voor het gemak kunt u de @csrf
Blade directive gebruiken om het verborgen token invoerveld te genereren:
<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>
De App\Http\Middleware\VerifyCsrfToken
middleware, die standaard is opgenomen in de web
middleware groep, zal automatisch controleren of het token in de verzoekinvoer overeenkomt met het token dat is opgeslagen in de sessie. Wanneer deze twee tokens overeenkomen, weten we dat de geauthenticeerde gebruiker degene is die het verzoek initieert.
CSRF Tokens & SPA’s
Als u een SPA bouwt die Laravel gebruikt als een API backend, moet u de Laravel Sanctum documentatie raadplegen voor informatie over authenticatie met uw API en bescherming tegen CSRF kwetsbaarheden.
URI’s Uitsluiten Van CSRF Beveiliging
Soms zult u een set van URI’s willen uitsluiten van CSRF bescherming. Bijvoorbeeld, als u Stripe gebruikt om betalingen te verwerken en hun webhook systeem gebruikt, moet u uw Stripe webhook handler route uitsluiten van CSRF bescherming, omdat Stripe niet zal weten welk CSRF token naar uw routes moet worden gestuurd.
Typisch, moet u dit soort routes buiten de web
middleware groep plaatsen die de App\Providers\RouteServiceProvider
toepast op alle routes in het routes/web.php
bestand. U kunt de routes echter ook uitsluiten door hun URI’s toe te voegen aan de $except
eigenschap van de VerifyCsrfToken
middleware:
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = ;}
{tip} Voor het gemak wordt de CSRF-middleware automatisch uitgeschakeld voor alle routes wanneer tests worden uitgevoerd.
X-CSRF-TOKEN
Naast het controleren op het CSRF-token als POST-parameter, controleert de App\Http\Middleware\VerifyCsrfToken
-middleware ook op de X-CSRF-TOKEN
-verzoek-header. U kunt het token bijvoorbeeld opslaan in een HTML meta
tag:
<meta name="csrf-token" content="{{ csrf_token() }}">
Daarna kunt u een bibliotheek als jQuery opdracht geven het token automatisch toe te voegen aan alle request headers. Dit biedt eenvoudige, handige CSRF-bescherming voor uw AJAX-gebaseerde toepassingen die legacy JavaScript-technologie gebruiken:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});
X-XSRF-TOKEN
Laravel slaat het huidige CSRF-token op in een gecodeerd XSRF-TOKEN
-cookie dat wordt opgenomen in elk antwoord dat door het framework wordt gegenereerd. U kunt de cookie-waarde gebruiken om de X-XSRF-TOKEN
request header in te stellen.
Dit cookie wordt voornamelijk verzonden als een gemak voor ontwikkelaars omdat sommige JavaScript frameworks en bibliotheken, zoals Angular en Axios, de waarde ervan automatisch in de X-XSRF-TOKEN
header plaatsen bij same-origin requests.