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í.
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.
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ř POST
, PUT
, PATCH
e DELETE
, 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éž.
<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.
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:
$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
Rozvíjení jemné motoriky prostřednictvím vybarvování připravuje děti na složitější dovednosti, jako je psaní. Barvit…
Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...
Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…
Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…