Artiklar

Laravel Web Security: Vad är Cross-Site Request Forgery (CSRF)?

I denna Laravel-handledning pratar vi om webbsäkerhet och hur man skyddar en webbapplikation från Cross-Site Request Forgery eller CSRF-attacker.

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.

Vad är CSRF?

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.

Hur man förhindrar CSRF-förfrågningar

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 POSTPUTPATCHDELETE, 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.

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.
<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.

Hur och var CSRF-verifieringen äger rum

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:

  1. skaffa sig $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

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.

Articoli recenti

Innovativ intervention i Augmented Reality, med en Apple-tittare på Catania poliklinik

En oftalmoplastikoperation med Apple Vision Pro kommersiella tittare utfördes på Catania Polyclinic...

3 maj 2024

Fördelarna med målarbok för barn - en värld av magi för alla åldrar

Att utveckla finmotorik genom färgläggning förbereder barn för mer komplexa färdigheter som att skriva. Att färglägga…

2 maj 2024

Framtiden är här: Hur sjöfartsindustrin revolutionerar den globala ekonomin

Marinesektorn är en sann global ekonomisk makt, som har navigerat mot en marknad på 150 miljarder...

1 maj 2024

Publishers och OpenAI tecknar avtal för att reglera flödet av information som bearbetas av artificiell intelligens

I måndags tillkännagav Financial Times ett avtal med OpenAI. FT licensierar sin journalistik i världsklass...

30 April 2024