tovar

Laravel Web Security: Čo je falšovanie žiadostí medzi stránkami (CSRF)?

V tomto návode Laravel hovoríme o Web Security a o tom, ako chrániť webovú aplikáciu pred útokmi typu Cross-Site Request Forgery alebo CSRF.

CSRF je škodlivá aktivita vykonávaná útočníkom, ktorý vykonáva akcie v mene overeného používateľa, čo poškodzuje webovú bezpečnosť. Našťastie Laravel poskytuje nástroje na predchádzanie tomuto typu zraniteľnosti.

čo je CSRF?

CSRF útočí na únosy používateľských relácií. Robia to tak, že oklamú používateľa, aby odoslal žiadosť prostredníctvom skrytých značiek formulárov alebo škodlivých adries URL (obrázkov alebo odkazov) bez vedomia používateľa.

Tento útok vedie k zmene stavu relácie používateľa, úniku údajov a niekedy môžu hackeri manipulovať s údajmi koncových používateľov v aplikácii.

Vyššie uvedený obrázok ilustruje scenár, v ktorom je narušená webová bezpečnosť. Obeť odošle požiadavku kliknutím na odkaz (prijatý), odošle požiadavku na webový server, čo vyvolá efekty požadované hackerom, ktorý získa informácie užitočné pre prístup a manipuláciu s webovým serverom.

Ako zabrániť žiadostiam CSRF

Na zlepšenie zabezpečení web vašich aplikácií, v každej používateľskej relácii, Laravel generuje bezpečné tokeny, ktoré používa na zaistenie toho, že autentifikovaný používateľ je ten, kto požaduje aplikáciu.

Keďže sa tento token mení pri každom opätovnom vygenerovaní relácie používateľa, útočník k nemu nemá prístup.

Vždy, keď sa vyskytne požiadavka na zmenu informácií o používateľovi na strane servera (backend), napr POSTPUTPATCHDELETE, musíte uviesť smernicu @csrf vo formulári žiadosti blade HTML. The @csrf ide teda o smernicu Blade používa sa na generovanie skrytého tokenu overeného aplikáciou.

Smernica Blade je syntax používaná v nástroji šablón Laravel s názvom Čepeľ . Ak chcete vytvoriť súbor blade musíte mu dať názov – v našom prípade tvar – a potom predĺženie čepele. To znamená, že súbor bude mať názov form.blade.php.

Súbor sa používa blade na vykreslenie zobrazení pre používateľov na webovej stránke. Existuje niekoľko predbežných smernícdefiMôžete použiť syntax nite alebo blade. Napríklad, @if skontrolujte, či je splnená podmienka, @empty skontrolujte, či záznamy nie sú prázdne, @auth skontrolujte, či je používateľ overený a podobne.

Ale vráťme sa k smernici @csrf. Používate ho takto:

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

    @csrf
    
</form>

Predchádzajúce verzie Laravelu mali iné nastavenie: obe fungujú a robia to isté.

Inovačný bulletin
Nenechajte si ujsť najdôležitejšie novinky o inováciách. Prihláste sa na ich odber e-mailom.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Keď v odoslanej žiadosti o formulár chýba token CSRF alebo ak sa zdá, že je neplatný, Laravel zobrazí chybové hlásenie „Platnosť stránky vypršala“ so stavovým kódom 419.

Ako a kde prebieha overenie CSRF

Stredný softvér VerifyCsrfToken rieši CSRF overenie v rámci aplikácie Laravel. The middleware je registrovaná v Kernel.php a nachádza sa v adresári app/Http/Middleware. To znamená, že middleware spúšťa sa pre požiadavky v rámci webu, ktoré nesúvisia s rozhraniami API.

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

Middleware VerifyCsrfToken rozširuje triedu Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, teda overenie CSRF je defiv triede.

Poďme hlbšie zistiť, ako Laravel zvláda overenie CSRF.

Vo vnútri triedy máme funkciu tokensMatch.

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

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

v kóde určuje, či sa relácia a vstupné tokeny CSRF zhodujú.

Funkcia robí dve veci:

  1. dostať $this->getTokenFromRequest token z prichádzajúcej požiadavky pripojený cez skryté pole alebo hlavičku požiadavky. Token sa dešifruje a potom sa vráti do premennej tokenu.
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;
}

V kóde získa token z hlavičky

2. Preneste token požiadavky aj reláciu do reťazca a potom použite hash_equals vstavaný v PHP na porovnanie, či sú oba reťazce rovnaké. Výsledok tejto operácie je vždy bool (pravda) alebo (nepravda) .

Ercole Palmeri

Inovačný bulletin
Nenechajte si ujsť najdôležitejšie novinky o inováciách. Prihláste sa na ich odber e-mailom.

Nedávne články

Výhody farebných stránok pre deti - svet mágie pre všetky vekové kategórie

Rozvíjanie jemnej motoriky pomocou vyfarbovania pripravuje deti na zložitejšie zručnosti, ako je písanie. Na farbenie…

2 mája 2024

Budúcnosť je tu: Ako námorný priemysel prináša revolúciu do globálnej ekonomiky

Námorný sektor je skutočnou globálnou ekonomickou veľmocou, ktorá smerovala k 150 miliardovému trhu...

1 mája 2024

Vydavatelia a OpenAI podpisujú dohody o regulácii toku informácií spracovávaných umelou inteligenciou

Minulý pondelok Financial Times oznámili dohodu s OpenAI. FT licencuje svoju žurnalistiku svetovej triedy…

Apríla 30 2024

Online platby: Takto budete vďaka streamovacím službám platiť navždy

Milióny ľudí platia za streamovacie služby a platia mesačné predplatné. Je bežný názor, že si…

Apríla 29 2024