- Introducere
- Prevenirea cererilor CSRF
- Excluderea URI-urilor
- X-CSRF-Token
- X-XSRF-.Token
Introducere
Falsificările de cereri încrucișate pe site sunt un tip de exploatare malițioasă prin care se execută comenzi neautorizate în numele unui utilizator autentificat. Din fericire, Laravel facilitează protejarea aplicației dvs. împotriva atacurilor cross-site request forgery (CSRF).
O explicație a vulnerabilității
În cazul în care nu sunteți familiarizați cu cross-site request forgeries, să discutăm un exemplu de cum poate fi exploatată această vulnerabilitate. Imaginați-vă că aplicația dumneavoastră are o rută /user/email
care acceptă o cerere POST
pentru a schimba adresa de e-mail a utilizatorului autentificat. Cel mai probabil, această rută se așteaptă ca un câmp de intrare email
să conțină adresa de e-mail pe care utilizatorul ar dori să înceapă să o folosească.
Fără protecție CSRF, un site web malițios ar putea crea un formular HTML care să puncteze către ruta /user/email
a aplicației dvs. și să trimită propria adresă de e-mail a utilizatorului malițios:
<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>
Dacă site-ul web malițios trimite automat formularul atunci când se încarcă pagina, utilizatorul malițios trebuie doar să ademenească un utilizator neștiutor al aplicației dvs. să viziteze site-ul său web și adresa sa de e-mail va fi modificată în aplicația dvs.
Pentru a preveni această vulnerabilitate, trebuie să inspectăm fiecare cerere POST
, PUT
, PATCH
sau DELETE
de intrare pentru o valoare secretă a sesiunii pe care aplicația malițioasă nu o poate accesa.
Prevenirea solicitărilor CSRF
Laravel generează automat un „token” CSRF pentru fiecare sesiune de utilizator activă gestionată de aplicație. Acest token este utilizat pentru a verifica dacă utilizatorul autentificat este persoana care face efectiv cererile către aplicație. Deoarece acest token este stocat în sesiunea utilizatorului și se schimbă de fiecare dată când sesiunea este regenerată, o aplicație rău intenționată nu îl poate accesa.
Tokenul CSRF al sesiunii curente poate fi accesat prin intermediul sesiunii cererii sau prin intermediul funcției de ajutor csrf_token
:
use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});
De fiecare dată când definiți un formular HTML în aplicația dumneavoastră, ar trebui să includeți un câmp CSRF _token
ascuns în formular, astfel încât middleware-ul de protecție CSRF să poată valida cererea. Pentru comoditate, puteți utiliza directiva @csrf
Blade pentru a genera câmpul de introducere a token-ului ascuns:
<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>
Mijlocirea App\Http\Middleware\VerifyCsrfToken
, care este inclusă în grupul de middleware web
în mod implicit, va verifica automat dacă token-ul din formularul de introducere a cererii se potrivește cu token-ul stocat în sesiune. Atunci când aceste două token-uri se potrivesc, știm că utilizatorul autentificat este cel care a inițiat cererea.
Token-uri CSRF & SPA-uri
Dacă construiți un SPA care utilizează Laravel ca backend API, ar trebui să consultați documentația Laravel Sanctum pentru informații despre autentificarea cu API-ul dvs. și protejarea împotriva vulnerabilităților CSRF.
Excluderea URI-urilor de la protecția CSRF
Câteodată, este posibil să doriți să excludeți un set de URI-uri de la protecția CSRF. De exemplu, dacă utilizați Stripe pentru a procesa plățile și folosiți sistemul lor de webhook, va trebui să excludeți ruta dvs. Stripe webhook handler de la protecția CSRF, deoarece Stripe nu va ști ce token CSRF să trimită la rutele dvs.
În mod normal, ar trebui să plasați aceste tipuri de rute în afara grupului de middleware web
pe care App\Providers\RouteServiceProvider
îl aplică tuturor rutelor din fișierul routes/web.php
. Cu toate acestea, puteți, de asemenea, să excludeți rutele adăugând URI-urile lor la proprietatea $except
a middleware-ului VerifyCsrfToken
:
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = ;}
{tip} Pentru comoditate, middleware-ul CSRF este dezactivat automat pentru toate rutele atunci când se execută teste.
X-CSRF-TOKEN
În plus față de verificarea token-ului CSRF ca parametru POST, middleware-ul App\Http\Middleware\VerifyCsrfToken
va verifica, de asemenea, antetul de cerere X-CSRF-TOKEN
. Ați putea, de exemplu, să stocați token-ul într-un tag HTML meta
:
<meta name="csrf-token" content="{{ csrf_token() }}">
Apoi, puteți instrui o bibliotecă precum jQuery să adauge automat token-ul la toate antetele de cerere. Acest lucru oferă o protecție CSRF simplă și convenabilă pentru aplicațiile dvs. bazate pe AJAX care utilizează tehnologia JavaScript tradițională:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});
X-XSRF-TOKEN
Laravel stochează token-ul CSRF curent într-un cookie XSRF-TOKEN
criptat care este inclus cu fiecare răspuns generat de framework. Puteți utiliza valoarea cookie-ului pentru a seta antetul de cerere X-XSRF-TOKEN
.
Acest cookie este trimis în primul rând ca o comoditate pentru dezvoltatori, deoarece unele cadre și biblioteci JavaScript, cum ar fi Angular și Axios, plasează automat valoarea sa în antetul X-XSRF-TOKEN
la cererile cu același origine.
.