Artikler

Laravel Web Security: Hvad er Cross-Site Request Forgery (CSRF)?

I denne Laravel-tutorial taler vi om websikkerhed og hvordan man beskytter en webapplikation mod Cross-Site Request Forgery eller CSRF-angreb.

CSRF er en ondsindet aktivitet udført af en angriber, som udfører handlinger på vegne af en godkendt bruger, hvilket er skadeligt for websikkerheden. Heldigvis leverer Laravel værktøjerne til at forhindre denne type sårbarhed.

Hvad er CSRF?

CSRF-angreb kaprer brugersessioner. Det gør de ved at narre en bruger til at indsende en anmodning via skjulte formular-tags eller ondsindede URL'er (billeder eller links) uden brugerens viden.

Dette angreb fører til en ændring i brugersessionstilstand, datalæk, og nogle gange kan hackere manipulere slutbrugerdata i en applikation.

Billedet ovenfor illustrerer et scenarie, hvor websikkerheden er brudt. Offeret sender en anmodning ved at klikke på et link (modtaget), og sender en anmodning til en webstedsserver, som vil frembringe effekter, som hackeren ønsker, og som kommer i besiddelse af de oplysninger, der er nyttige til at få adgang til og manipulere webstedsserveren.

Sådan forhindres CSRF-anmodninger

For at forbedre sikkerhed web af dine applikationer, i hver brugersession genererer Laravel sikre tokens, som den bruger til at sikre, at den autentificerede bruger er den, der anmoder om applikationen.

Fordi dette token ændres, hver gang en brugersession gendannes, kan en angriber ikke få adgang til det.

Hver gang der er en anmodning om at ændre brugeroplysninger på serversiden (backend) f.eks POSTPUTPATCHDELETE, skal du medtage direktivet @csrf i anmodningsformularen blade HTML. Det @csrf det er derfor et direktiv Blade bruges til at generere et skjult token, der er valideret af applikationen.

Direktivet Blade kaldes den syntaks, der bruges i Laravel-skabelonmotoren Blade . For at oprette en fil blade du skal give den et navn – i vores tilfældeform – efterfulgt af forlængelsen af ​​bladet. Det betyder, at filen vil have navnet form.blade.php.

Filen er brugt blade for at gengive visninger for brugere på websiden. Der er et par præ-direktiverdefinite eller blade stenografi syntaks, du kan bruge. For eksempel, @if kontrollere, om en betingelse er opfyldt, @empty kontrollere, om posterne ikke er tomme, @auth kontrollere, om en bruger er godkendt og så videre.

Men lad os gå tilbage til direktivet @csrf. Sådan bruger du det:

<form method="POST" action="{{route('pay')}}">

    @csrf
    
</form>

Tidligere versioner af Laravel havde en anden opsætning: de både virker og gør det samme.

Nyhedsbrev om innovation
Gå ikke glip af de vigtigste nyheder om innovation. Tilmeld dig for at modtage dem via e-mail.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Når CSRF-tokenet mangler i den formularanmodning, der indsendes, eller hvis det ser ud til at være ugyldigt, sender Laravel en "Page Expired"-fejlmeddelelse med en 419-statuskode.

Hvordan og hvor CSRF-verifikationen finder sted

Mellemvare VerifyCsrfToken håndterer CSRF-verifikation i Laravel-applikationen. Det middleware er registreret i Kernel.php og er placeret i mappen app/Http/Middleware. Det betyder, at middleware den udløses for anmodninger på nettet, der ikke er relateret til API'erne.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

VerifyCsrfToken-middlewaren udvider klassen Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, dvs. CSRF-verifikation er defiaften i klassen.

Lad os grave dybere for at finde ud af, hvordan Laravel håndterer CSRF-verifikation.

Inde 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 bestemmer, om sessionen og input CSRF tokens matcher.

Funktionen gør to ting:

  1. $this->getTokenFromRequest tokenet fra den indgående anmodning vedhæftet via et skjult felt eller anmodningshovedet. Tokenet dekrypteres og returneres derefter til token-variablen.
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 fra header

2. Kast både anmodningstokenet og sessionen til en streng og brug derefter hash_equals indbygget i PHP for at sammenligne, hvis begge strenge er ens. Resultatet af denne operation er altid bool (sand) eller (falsk) .

Ercole Palmeri

Nyhedsbrev om innovation
Gå ikke glip af de vigtigste nyheder om innovation. Tilmeld dig for at modtage dem via e-mail.

Seneste artikler

Veeam har den mest omfattende support til ransomware, fra beskyttelse til respons og gendannelse

Coveware by Veeam vil fortsætte med at levere responstjenester til cyberafpresning. Coveware vil tilbyde kriminaltekniske og afhjælpende funktioner...

23 April 2024

Grøn og digital revolution: Hvordan prædiktiv vedligeholdelse transformerer olie- og gasindustrien

Forudsigende vedligeholdelse revolutionerer olie- og gassektoren med en innovativ og proaktiv tilgang til anlægsstyring...

22 April 2024

Britisk antitrust-tilsynsmyndighed rejser BigTech-alarm over GenAI

Det britiske CMA har udsendt en advarsel om Big Techs adfærd på markedet for kunstig intelligens. Der…

18 April 2024

Casa Green: energirevolution for en bæredygtig fremtid i Italien

Dekretet om "grønne huse", der er formuleret af Den Europæiske Union for at øge bygningers energieffektivitet, har afsluttet sin lovgivningsproces med...

18 April 2024