CSRF este o activitate rău intenționată efectuată de un atacator, care efectuează acțiuni în numele unui utilizator autentificat, în detrimentul securității web. Din fericire, Laravel oferă instrumentele pentru a preveni acest tip de vulnerabilitate.
Atacuri CSRF deturnează sesiunile utilizatorilor. Ei fac acest lucru prin păcălirea unui utilizator să trimită o solicitare prin etichete de formular ascunse sau URL-uri rău intenționate (imagini sau linkuri) fără știrea utilizatorului.
Acest atac duce la o schimbare a stării sesiunii utilizator, scurgeri de date și, uneori, hackerii pot manipula datele utilizatorului final într-o aplicație.
Imaginea de mai sus ilustrează un scenariu în care securitatea web este încălcată. Victima trimite o cerere făcând clic pe un link (primit), trimițând o solicitare către un server de site web care va produce efectele dorite de hacker, care intră în posesia informațiilor utile pentru accesarea și manipularea serverului site-ului.
Pentru a îmbunătăți siguranță web al aplicațiilor dvs., în fiecare sesiune de utilizator, Laravel generează token-uri securizate pe care le utilizează pentru a se asigura că utilizatorul autentificat este cel care solicită aplicația.
Deoarece acest token se modifică de fiecare dată când o sesiune de utilizator este regenerată, un atacator nu îl poate accesa.
Ori de câte ori există o solicitare de modificare a informațiilor despre utilizator pe partea serverului (backend), cum ar fi POST
, PUT
, PATCH
e DELETE
, trebuie să includeți directiva @csrf
în formularul de cerere blade
HTML. The @csrf
este deci o directivă Blade
folosit pentru a genera un token ascuns validat de aplicație.
Directiva Blade
este sintaxa folosită în motorul de șabloane Laravel numit Lamă . Pentru a crea un fișier blade
trebuie să îi dați un nume – în forma noastră de caz – urmat de extensia lamei. Aceasta înseamnă că fișierul va avea numele form.blade.php
.
Fișierul este folosit blade
pentru a reda vizualizări pentru utilizatori pe pagina web. Există câteva directive prealabiledefisintaxa scurtă nite sau blade pe care o puteți utiliza. De exemplu, @if
verifică dacă o condiție este îndeplinită, @empty
verificați dacă înregistrările nu sunt goale, @auth
verifică dacă un utilizator este autentificat și așa mai departe.
Dar să revenim la directivă @csrf
. Iată cum îl folosiți:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Versiunile anterioare de Laravel aveau o configurație diferită: ambele funcționează și fac același lucru.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Când simbolul CSRF nu este prezent în cererea de formular care este trimisă sau dacă pare a fi invalid, Laravel generează un mesaj de eroare „Pagină expirată” cu un cod de stare 419.
Middleware-ul VerifyCsrfToken
se ocupă de verificarea CSRF în cadrul aplicației Laravel. The middleware
este înregistrat în Kernel.php
și se află în director app/Http/Middleware
. Aceasta înseamnă că middleware
este declanșat pentru solicitări din web, nu sunt legate de API-uri.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Middleware-ul VerifyCsrfToken extinde clasa Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, adică verificarea CSRF este definitate în sala de clasă.
Să ne aprofundăm pentru a afla cum gestionează Laravel verificarea CSRF.
În cadrul clasei, avem funcția tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
în cod determină dacă sesiunea și jetoanele CSRF de intrare se potrivesc.
Funcția face două lucruri:
$this->getTokenFromRequest
jetonul de la cererea primită atașat printr-un câmp ascuns sau antetul cererii. Tokenul este decriptat și apoi returnat la variabila token.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;
}
În cod primește un simbol din antet
2. Transmite atât jetonul de solicitare, cât și sesiune într-un șir și apoi folosește hash_equals
construit în PHP pentru a compara dacă ambele șiruri sunt egale. Rezultatul acestei operațiuni este întotdeauna bool (adevărat) sau (fals) .
Ercole Palmeri
Luni trecută, Financial Times a anunțat un acord cu OpenAI. FT își licențiază jurnalismul de clasă mondială...
Milioane de oameni plătesc pentru serviciile de streaming, plătind taxe lunare de abonament. Este o părere comună că tu...
Coveware de la Veeam va continua să ofere servicii de răspuns la incidente de extorcare cibernetică. Coveware va oferi capacități criminalistice și de remediere...
Întreținerea predictivă revoluționează sectorul petrolului și gazelor, cu o abordare inovatoare și proactivă a managementului uzinelor...