Články

Laravel Web Security: Co je to cross-Site Request Forgery (CSRF)?

V tomto tutoriálu Laravel hovoříme o zabezpečení webu a o tom, jak chránit webovou aplikaci před útoky Cross-Site Request Forgery nebo CSRF.

CSRF je škodlivá aktivita prováděná útočníkem, který provádí akce jménem ověřeného uživatele, poškozující zabezpečení webu. Naštěstí Laravel poskytuje nástroje, které tomuto typu zranitelnosti předcházejí.

Co je CSRF?

CSRF útoky hijack uživatelské relace. Dělají to tak, že uživatele přimějí k odeslání požadavku prostřednictvím skrytých značek formuláře nebo škodlivých adres URL (obrázků nebo odkazů) bez vědomí uživatele.

Tento útok vede ke změně stavu uživatelské relace, únikům dat a někdy mohou hackeři manipulovat s daty koncových uživatelů v aplikaci.

Obrázek výše ilustruje scénář, kdy je narušeno zabezpečení webu. Oběť odešle požadavek kliknutím na odkaz (přijatý), odesláním požadavku na webový server, který vyvolá efekty požadované hackerem, který získá informace užitečné pro přístup a manipulaci s webovým serverem.

Jak zabránit žádostem CSRF

Pro zlepšení zabezpečení webu vašich aplikací, v každé uživatelské relaci, Laravel generuje bezpečné tokeny, které používá k zajištění toho, že ověřený uživatel je ten, kdo žádá o aplikaci.

Protože se tento token mění při každém opětovném obnovení uživatelské relace, útočník k němu nemá přístup.

Kdykoli se objeví požadavek na změnu informací o uživateli na straně serveru (backendu), např POSTPUTPATCHDELETE, musíte zahrnout směrnici @csrf ve formuláři žádosti blade HTML. The @csrf jde tedy o směrnici Blade slouží ke generování skrytého tokenu ověřeného aplikací.

Směrnice Blade je syntaxe používaná v rámci šablonového enginu Laravel s názvem Čepel . Chcete-li vytvořit soubor blade musíte mu dát jméno – v našem případě tvar – následovaný prodloužením čepele. To znamená, že soubor bude mít název form.blade.php.

Soubor je použit blade k vykreslení zobrazení pro uživatele na webové stránce. Existuje několik předběžných směrnicdefinite nebo blade zkrácenou syntaxi, kterou můžete použít. Například, @if zkontrolovat, zda je splněna podmínka, @empty zkontrolovat, zda záznamy nejsou prázdné, @auth zkontrolovat, zda je uživatel ověřen a tak dále.

Ale vraťme se ke směrnici @csrf. Používáte ji takto:

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

    @csrf
    
</form>

Předchozí verze Laravelu měly jiné nastavení: obě fungují a dělají totéž.

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Když token CSRF v odesílaném požadavku formuláře chybí nebo pokud se zdá neplatný, Laravel vyvolá chybovou zprávu „Page Expired“ se stavovým kódem 419.

Jak a kde probíhá ověření CSRF

Middleware VerifyCsrfToken zpracovává CSRF ověření v rámci aplikace Laravel. The middleware je registrován v Kernel.php a nachází se v adresáři app/Http/Middleware. To znamená, že middleware spouští se pro požadavky v rámci webu, které nesouvisejí s rozhraními API.

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

Middleware VerifyCsrfToken rozšiřuje třídu Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, tj. CSRF ověření je defive třídě.

Pojďme se ponořit hlouběji, abychom zjistili, jak Laravel zpracovává CSRF ověření.

Uvnitř třídy máme funkci 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ódu určuje, zda se relace a vstupní tokeny CSRF shodují.

Funkce dělá dvě věci:

  1. dostat $this->getTokenFromRequest token z příchozího požadavku připojený přes skryté pole nebo hlavičku požadavku. Token je dešifrován a poté vrácen do proměnné 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ódu získává token z hlavičky

2. Odešlete token požadavku i relaci do řetězce a poté použijte hash_equals vestavěný v PHP pro porovnání, zda jsou oba řetězce stejné. Výsledek této operace je vždy bool (pravda) nebo (nepravda) .

Ercole Palmeri

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nedávné články

Výhody omalovánek pro děti - svět kouzel pro všechny věkové kategorie

Rozvíjení jemné motoriky prostřednictvím vybarvování připravuje děti na složitější dovednosti, jako je psaní. Barvit…

2. května 2024

Budoucnost je tady: Jak lodní průmysl revolucionizuje globální ekonomiku

Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...

1. května 2024

Vydavatelé a OpenAI podepisují dohody o regulaci toku informací zpracovávaných umělou inteligencí

Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…

30. dubna 2024

Online platby: Zde je návod, jak vám streamovací služby umožňují platit navždy

Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…

29. dubna 2024