CSRF is een kwaadaardige activiteit die wordt uitgevoerd door een aanvaller, die acties uitvoert namens een geverifieerde gebruiker, die schadelijk is voor de webbeveiliging. Gelukkig biedt Laravel de tools om dit type kwetsbaarheid te voorkomen.
CSRF-aanvallen kapen gebruikerssessies. Ze doen dit door een gebruiker te misleiden om een verzoek in te dienen via verborgen formuliertags of kwaadaardige URL's (afbeeldingen of links) zonder medeweten van de gebruiker.
Deze aanval leidt tot een verandering in de status van de gebruikerssessie, datalekken en soms kunnen hackers eindgebruikersgegevens in een applicatie manipuleren.
De afbeelding hierboven illustreert een scenario waarin de webbeveiliging wordt geschonden. Het slachtoffer verzendt een verzoek door op een link te klikken (ontvangen), en stuurt een verzoek naar een websiteserver die de gewenste effecten zal produceren door de hacker, die in het bezit komt van de informatie die nuttig is voor toegang tot en manipulatie van de websiteserver.
Om te verbeteren veiligheid web van uw applicaties genereert Laravel in elke gebruikerssessie beveiligde tokens die het gebruikt om ervoor te zorgen dat de geverifieerde gebruiker degene is die de applicatie aanvraagt.
Omdat dit token telkens verandert wanneer een gebruikerssessie opnieuw wordt gegenereerd, heeft een aanvaller er geen toegang toe.
Wanneer er een verzoek is om gebruikersinformatie aan de serverzijde (backend) te wijzigen, zoals POST
, PUT
, PATCH
e DELETE
, moet u de richtlijn opnemen @csrf
in het aanvraagformulier blade
HTML. De @csrf
het is dus een richtlijn Blade
gebruikt om een verborgen token te genereren dat door de toepassing is gevalideerd.
De richtlijn Blade
is de syntaxis die wordt gebruikt in de Laravel-sjabloonengine Blad . Om een bestand aan te maken blade
je moet het een naam geven – in ons geval – gevolgd door de extensie van het mes. Dit betekent dat het bestand de naam zal hebben form.blade.php
.
Het bestand wordt gebruikt blade
om weergaven voor gebruikers op de webpagina weer te geven.Er zijn een aantal pre-directivesdefinite of blade steno-syntaxis die u kunt gebruiken. Bijvoorbeeld, @if
controleren of aan een voorwaarde is voldaan, @empty
controleer of de records niet leeg zijn, @auth
controleren of een gebruiker is geverifieerd enzovoort.
Maar laten we teruggaan naar de richtlijn @csrf
. Zo gebruik je het:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Eerdere versies van Laravel hadden een andere opzet: ze werken allebei en doen hetzelfde.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Wanneer het CSRF-token ontbreekt in het ingediende formulierverzoek of als het ongeldig lijkt, genereert Laravel een foutmelding "Pagina verlopen" met een 419-statuscode.
De middleware VerifyCsrfToken
behandelt CSRF-verificatie binnen de Laravel-applicatie. De middleware
is ingeschreven Kernel.php
en staat in de directory app/Http/Middleware
. Dit betekent dat de middleware
het wordt geactiveerd voor verzoeken binnen het web, niet gerelateerd aan de API's.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
De VerifyCsrfToken-middleware breidt de klasse uit Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, d.w.z. CSRF-verificatie is definiét in de klas.
Laten we dieper graven om erachter te komen hoe Laravel omgaat met CSRF-verificatie.
Binnen de klas hebben we de functie tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
in de code bepaalt of de sessie en de ingevoerde CSRF-tokens overeenkomen.
De functie doet twee dingen:
$this->getTokenFromRequest
het token van het inkomende verzoek dat is bijgevoegd via een verborgen veld of de verzoekkop. Het token wordt gedecodeerd en vervolgens teruggestuurd naar de tokenvariabele.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
In de code krijgt het een token van de header
2. Cast zowel het verzoektoken als de sessie naar een string en gebruik dan hash_equals
gebouwd in PHP om te vergelijken of beide strings gelijk zijn. Het resultaat van deze operatie is altijd bool (waar) of (onwaar) .
Ercole Palmeri
Afgelopen maandag maakte de Financial Times een deal met OpenAI bekend. FT geeft licenties voor haar journalistiek van wereldklasse...
Miljoenen mensen betalen voor streamingdiensten en betalen maandelijkse abonnementskosten. De algemene mening is dat je…
Coveware by Veeam zal responsdiensten op het gebied van cyberafpersingsincidenten blijven leveren. Coveware zal forensische en herstelmogelijkheden bieden...
Voorspellend onderhoud zorgt voor een revolutie in de olie- en gassector, met een innovatieve en proactieve benadering van fabrieksbeheer.…