CSRF är en skadlig aktivitet som utförs av en angripare, som utför åtgärder på uppdrag av en autentiserad användare, som skadar webbsäkerheten. Lyckligtvis tillhandahåller Laravel verktygen för att förhindra denna typ av sårbarhet.
CSRF-attacker kapar användarsessioner. De gör detta genom att lura en användare att skicka en begäran via dolda formulärtaggar eller skadliga webbadresser (bilder eller länkar) utan användarens vetskap.
Denna attack leder till en förändring i användarsessionstillstånd, dataläckor och ibland kan hackare manipulera slutanvändardata i en applikation.
Bilden ovan illustrerar ett scenario där webbsäkerheten bryts. Offret skickar en förfrågan genom att klicka på en länk (mottagen), skicka en förfrågan till en webbserver som kommer att ge effekter som önskas av hackaren, som kommer i besittning av informationen som är användbar för att komma åt och manipulera webbservern.
För att förbättra säkerhet webben av dina applikationer, i varje användarsession genererar Laravel säkra tokens som den använder för att säkerställa att den autentiserade användaren är den som begär applikationen.
Eftersom denna token ändras varje gång en användarsession återskapas kan en angripare inte komma åt den.
Närhelst det finns en begäran om att ändra användarinformation på serversidan (backend) som POST
, PUT
, PATCH
e DELETE
, måste du inkludera direktivet @csrf
i ansökningsformuläret blade
HTML. De @csrf
det är därför ett direktiv Blade
används för att generera en dold token som valideras av applikationen.
Direktivet Blade
kallas syntaxen som används inom Laravels mallmotor Blade . För att skapa en fil blade
du måste ge den ett namn – i vårt fall form – följt av förlängningen av bladet. Det betyder att filen kommer att ha namnet form.blade.php
.
Filen används blade
för att återge vyer för användare på webbsidan. Det finns ett par förhandsdirektivdefinite eller blade stenografi syntax som du kan använda. Till exempel, @if
kontrollera om ett villkor är uppfyllt, @empty
kontrollera om posterna inte är tomma, @auth
kontrollera om en användare är autentiserad och så vidare.
Men låt oss gå tillbaka till direktivet @csrf
. Så här använder du det:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Tidigare versioner av Laravel hade en annan inställning: de båda fungerar och gör samma sak.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
När CSRF-token saknas i formulärbegäran som skickas in eller om den verkar ogiltig, skickar Laravel ett "Sida har löpt ut" felmeddelande med en 419-statuskod.
Mellanvaran VerifyCsrfToken
hanterar CSRF-verifiering inom Laravel-applikationen. De middleware
är registrerad i Kernel.php
och finns i katalogen app/Http/Middleware
. Detta innebär att middleware
den utlöses för förfrågningar inom webben, inte relaterade till API:erna.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
VerifyCsrfToken-mellanvaran utökar klassen Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, dvs CSRF-verifiering är definatt i klassen.
Låt oss gräva djupare för att ta reda på hur Laravel hanterar CSRF-verifiering.
Inne i klassen har vi funktionen tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
i koden bestämmer om sessionen och inmatade CSRF-token matchar.
Funktionen gör två saker:
$this->getTokenFromRequest
token från den inkommande förfrågan bifogad via ett dolt fält eller förfrågningshuvudet. Token dekrypteras och returneras sedan till tokenvariabeln.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;
}
I koden får den token från header
2. Kasta både begäranstoken och sessionen till en sträng och använd sedan hash_equals
inbyggd i PHP för att jämföra om båda strängarna är lika. Resultatet av denna operation är alltid bool (sant) eller (falskt) .
Ercole Palmeri
En oftalmoplastikoperation med Apple Vision Pro kommersiella tittare utfördes på Catania Polyclinic...
Att utveckla finmotorik genom färgläggning förbereder barn för mer komplexa färdigheter som att skriva. Att färglägga…
Marinesektorn är en sann global ekonomisk makt, som har navigerat mot en marknad på 150 miljarder...
I måndags tillkännagav Financial Times ett avtal med OpenAI. FT licensierar sin journalistik i världsklass...