artikels

Laravel Web Security: Wat is Cross-Site Request Forgery (CSRF)?

Yn dit Laravel-tutorial prate wy oer Webfeiligens en hoe't jo in webapplikaasje kinne beskermje tsjin Cross-Site Request Forgery of CSRF-oanfallen.

CSRF is in kweade aktiviteit útfierd troch in oanfaller, dy't aksjes útfiert út namme fan in autentike brûker, skealik foar webfeiligens. Gelokkich leveret Laravel de ark om dit soarte fan kwetsberens te foarkommen.

Wat is CSRF?

CSRF-oanfallen hijack brûkerssesjes. Se dogge dit troch in brûker te ferrifeljen om in fersyk yn te tsjinjen fia ferburgen formuliertags of kweade URL's (ôfbyldings of keppelings) sûnder de kennis fan 'e brûker.

Dizze oanfal liedt ta in feroaring yn brûker sesje tastân, gegevens lekken, en soms hackers kinne manipulearje ein-brûker gegevens yn in applikaasje.

De ôfbylding hjirboppe yllustrearret in senario wêr't webfeiligens wurdt ynbrutsen. It slachtoffer stjoert in fersyk troch te klikken op in keppeling (ûntfongen), it ferstjoeren fan in fersyk nei in webside-tsjinner dy't effekten sil produsearje dy't winske wurde troch de hacker, dy't yn besit komt fan 'e ynformaasje dy't nuttich is foar tagong en manipulearjen fan' e websideserver.

Hoe kinne jo CSRF-oanfragen foarkomme

Te ferbetterjen de feiligens web fan jo applikaasjes, yn elke brûkerssesje, genereart Laravel feilige tokens dy't it brûkt om te soargjen dat de autentike brûker dejinge is dy't de applikaasje freget.

Om't dit token elke kear feroaret as in brûkerssesje wurdt regenerearre, kin in oanfaller gjin tagong krije ta it.

Wannear't d'r in fersyk is om brûkersynformaasje te feroarjen op serverkant (backend) lykas POSTPUTPATCHDELETE, jo moatte de rjochtline opnimme @csrf yn it oanfraachformulier blade HTML. De @csrf it is dus in rjochtline Blade brûkt om in ferburgen token te generearjen dy't validearre is troch de applikaasje.

De rjochtline Blade is de syntaksis brûkt binnen de Laravel sjabloan motor neamd Blade . Om in triem te meitsjen blade jo moatte it in namme jaan - yn ús gefal formulier - folge troch de útwreiding fan it blêd. Dit betsjut dat it bestân de namme sil hawwe form.blade.php.

De triem wurdt brûkt blade om werjeften foar brûkers op 'e webside wer te jaan. Der binne in pear foarrjochtlinendefinite of blade shorthand syntaksis dy't jo kinne brûke. Bygelyks, @if kontrolearje oft in betingst foldien is, @empty kontrolearje oft de records net leech binne, @auth kontrolearje oft in brûker is authentisearre en sa fierder.

Mar litte wy weromgean nei de rjochtline @csrf. Hjir is hoe't jo it brûke:

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

    @csrf
    
</form>

Foarige ferzjes fan Laravel hiene in oare opset: se wurkje beide en dogge itselde ding.

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

As it CSRF-token ûntbrekt yn it yntsjinne formulieroanfraach of as it ûnjildich liket, smyt Laravel in flaterberjocht "Page Expired" mei in 419-statuskoade.

Hoe en wêr't de CSRF-ferifikaasje plakfynt

De middelgrutte VerifyCsrfToken behannelet CSRF-ferifikaasje binnen de Laravel-applikaasje. De middleware is registrearre yn Kernel.php en leit yn 'e map app/Http/Middleware. Dit betsjut dat de middleware it wurdt aktivearre foar oanfragen binnen it web, net relatearre oan de API's.

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

De VerifyCsrfToken-middleware wreidet de klasse út Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, i.e. CSRF ferifikaasje is definacht binnen de klasse.

Litte wy djipper grave om út te finen hoe't Laravel CSRF-ferifikaasje omgiet.

Binnen de klasse hawwe wy de funksje tokensMatch.

protected function tokensMatch($request)
{
     $token = $this->getTokenFromRequest($request);

     return is_string($request->session()->token()) &&
            is_string($token) &&
            hash_equals($request->session()->token(), $token);
}

yn de koade bepaalt oft de sesje en de ynfier CSRF tokens oerien.

De funksje docht twa dingen:

  1. krije $this->getTokenFromRequest it token fan it ynkommende fersyk taheakke fia in ferburgen fjild of de fersykkop. It token wurdt ûntsifere en dan weromjûn nei de tokenfariabele.
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;
}

Yn 'e koade wurdt it token fan koptekst

2. Cast sawol it fersyk token as de sesje nei in tekenrige en dan brûke hash_equals boud yn PHP om te fergelykjen as beide snaren gelyk binne. It resultaat fan dizze operaasje is altyd bool (wier) of (net wier) .

Ercole Palmeri

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.

Recent articles

De foardielen fan kleurplaten foar bern - in wrâld fan magy foar alle leeftiden

It ûntwikkeljen fan fynmotoryske feardigens troch kleurjen taret bern op mear komplekse feardigens lykas skriuwen. Kleurje...

2 mei 2024

De takomst is hjir: hoe't de skipfeartsektor de wrâldekonomy revolúsjonearret

De marinesektor is in wiere wrâldwide ekonomyske macht, dy't navigearre is nei in merk fan 150 miljard ...

1 mei 2024

Utjouwers en OpenAI tekenje oerienkomsten om de stream fan ynformaasje te regeljen ferwurke troch Artificial Intelligence

Ofrûne moandei kundige de Financial Times in deal oan mei OpenAI. FT lisinsje har sjoernalistyk fan wrâldklasse ...

30 april 2024

Online betellingen: Hjir is hoe streamingtsjinsten jo foar altyd betelje

Miljoenen minsken betelje foar streamingtsjinsten, beteljen moanlikse abonnemintskosten. It is gewoane miening dat jo ...

29 april 2024