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.
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.
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 POST
, PUT
, PATCH
e DELETE
, 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é.
<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.
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:
$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
Rozvíjanie jemnej motoriky pomocou vyfarbovania pripravuje deti na zložitejšie zručnosti, ako je písanie. Na farbenie…
Námorný sektor je skutočnou globálnou ekonomickou veľmocou, ktorá smerovala k 150 miliardovému trhu...
Minulý pondelok Financial Times oznámili dohodu s OpenAI. FT licencuje svoju žurnalistiku svetovej triedy…
Milióny ľudí platia za streamovacie služby a platia mesačné predplatné. Je bežný názor, že si…