CSRF-beskyttelse

  • Indledning
  • Forebyggelse af CSRF-forespørgsler
    • Udelukkelse af URI’er
  • X-CSRF-Token
  • X-X-XSRF-Token

Indledning

Cross-site request forgeries er en form for ondsindet udnyttelse, hvor uautoriserede kommandoer udføres på vegne af en autentificeret bruger. Heldigvis gør Laravel det nemt at beskytte din applikation mod CSRF-angreb (cross-site request forgery).

En forklaring af sårbarheden

Hvis du ikke er bekendt med cross-site request forgeries, så lad os diskutere et eksempel på, hvordan denne sårbarhed kan udnyttes. Forestil dig, at dit program har en /user/email-rute, der accepterer en POST-anmodning om at ændre den autentificerede brugers e-mail-adresse. Denne rute forventer højst sandsynligt, at et email inputfelt indeholder den e-mail-adresse, som brugeren gerne vil begynde at bruge.

Og uden CSRF-beskyttelse kunne et ondsindet websted oprette en HTML-formular, der peger på din applikations /user/email-rute og indsender den ondsindede brugers egen e-mail-adresse:

<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>

Hvis det ondsindede websted automatisk indsender formularen, når siden indlæses, behøver den ondsindede bruger blot at lokke en intetanende bruger af din applikation til at besøge deres website, og så vil deres e-mail-adresse blive ændret i din applikation.

For at forhindre denne sårbarhed skal vi inspicere hver indgående POST, PUT, PATCH eller DELETE-anmodning for en hemmelig sessionsværdi, som det ondsindede program ikke kan få adgang til.

Forebyggelse af CSRF-anmodninger

Laravel genererer automatisk et CSRF-“token” for hver aktiv brugersession, der administreres af programmet. Dette token bruges til at verificere, at den autentificerede bruger er den person, der rent faktisk foretager anmodningerne til programmet. Da dette token gemmes i brugerens session og ændres, hver gang sessionen regenereres, kan et ondsindet program ikke få adgang til det.

Den aktuelle sessions CSRF-token kan tilgås via anmodningens session eller via hjælpefunktionen csrf_token:

use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});

Når du definerer en HTML-formular i dit program, bør du inkludere et skjult CSRF _token-felt i formularen, så CSRF-beskyttelses-middlewaren kan validere anmodningen. For nemheds skyld kan du bruge @csrf Blade-direktivet til at generere det skjulte tokenindtastningsfelt:

<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>

Den App\Http\Middleware\VerifyCsrfToken middleware, der som standard er inkluderet i web middlewaregruppen, kontrollerer automatisk, at tokenet i anmodningsindtastningen passer til det token, der er gemt i sessionen. Når disse tokens stemmer overens, ved vi, at det er den autentificerede bruger, der initierer anmodningen.

CSRF-tokens & SPA’er

Hvis du bygger en SPA, der anvender Laravel som API-baggrund, bør du konsultere Laravel Sanctum-dokumentationen for at få oplysninger om autentificering med din API og beskyttelse mod CSRF-sårbarheder.

Udeladelse af URI’er fra CSRF-beskyttelse

I nogle tilfælde ønsker du måske at udelukke et sæt URI’er fra CSRF-beskyttelse. Hvis du f.eks. bruger Stripe til at behandle betalinger og benytter deres webhook-system, skal du udelukke din Stripe-webhook-handlerrute fra CSRF-beskyttelse, da Stripe ikke ved, hvilket CSRF-token der skal sendes til dine ruter.

Typisk skal du placere disse typer ruter uden for web middlewaregruppen, som App\Providers\RouteServiceProvider gælder for alle ruter i routes/web.php-filen. Du kan dog også udelukke ruterne ved at tilføje deres URI’er til $except-egenskaben for VerifyCsrfToken middleware:

<?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} For nemheds skyld deaktiveres CSRF-middlewaren automatisk for alle ruter, når du kører test.

X-CSRF-TOKEN

Foruden at kontrollere for CSRF-tokenet som en POST-parameter kontrollerer App\Http\Middleware\VerifyCsrfToken-middlewaren også for X-CSRF-TOKEN-anmodningshovedet. Du kan f.eks. gemme tokenet i et HTML meta-tag:

<meta name="csrf-token" content="{{ csrf_token() }}">

Derpå kan du instruere et bibliotek som jQuery til automatisk at tilføje tokenet til alle request headers. Dette giver en enkel og praktisk CSRF-beskyttelse til dine AJAX-baserede applikationer, der bruger ældre JavaScript-teknologi:

$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});

X-XSRF-TOKEN

Laravel gemmer det aktuelle CSRF-token i en krypteret XSRF-TOKEN-cookie, der medfølger hvert svar, der genereres af rammen. Du kan bruge cookieværdien til at indstille X-XSRF-TOKEN-anmodningshovedet.

Denne cookie sendes primært som en bekvemmelighed for udviklere, da nogle JavaScript-rammer og -biblioteker, som Angular og Axios, automatisk placerer dens værdi i X-XSRF-TOKEN-hovedet på anmodninger af samme oprindelse.

Skriv en kommentar