CSRF és una activitat maliciosa realitzada per un atacant, que realitza accions en nom d'un usuari autenticat, perjudicials per a la seguretat web. Afortunadament, Laravel ofereix les eines per prevenir aquest tipus de vulnerabilitat.
Els atacs CSRF segresten les sessions dels usuaris. Ho fan enganyant un usuari perquè enviï una sol·licitud mitjançant etiquetes de formularis ocults o URL maliciosos (imatges o enllaços) sense que l'usuari ho sap.
Aquest atac provoca un canvi en l'estat de la sessió de l'usuari, filtracions de dades i, de vegades, els pirates informàtics poden manipular les dades de l'usuari final en una aplicació.
La imatge de dalt il·lustra un escenari en què s'ha trencat la seguretat web. La víctima envia una sol·licitud fent clic a un enllaç (rebut), enviant una sol·licitud a un servidor web que produirà els efectes desitjats pel pirata informàtic, que entra en possessió de la informació útil per accedir i manipular el servidor del lloc web.
Per millorar el seguretat web de les vostres aplicacions, en cada sessió d'usuari, Laravel genera fitxes segures que utilitza per garantir que l'usuari autenticat és qui sol·licita l'aplicació.
Com que aquest testimoni canvia cada vegada que es regenera una sessió d'usuari, un atacant no hi pot accedir.
Sempre que hi hagi una sol·licitud per canviar la informació de l'usuari al costat del servidor (backend), com ara POST
, PUT
, PATCH
e DELETE
, heu d'incloure la directiva @csrf
en el formulari de sol·licitud blade
HTML. El @csrf
per tant, és una directiva Blade
s'utilitza per generar un testimoni ocult validat per l'aplicació.
La directiva Blade
és la sintaxi que s'utilitza dins del motor de plantilles Laravel anomenat Full . Per crear un fitxer blade
has de donar-li un nom, en el nostre cas, seguit de l'extensió de la fulla. Això vol dir que el fitxer tindrà el nom form.blade.php
.
S'utilitza el fitxer blade
per representar visualitzacions per als usuaris a la pàgina web. Hi ha un parell de predirectivesdefisintaxi de taquigrafia nite o blade que podeu utilitzar. Per exemple, @if
comprovar si es compleix una condició, @empty
comproveu si els registres no estan buits, @auth
comproveu si un usuari està autenticat i així successivament.
Però tornem a la directiva @csrf
. A continuació us indiquem com l'utilitzeu:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
Les versions anteriors de Laravel tenien una configuració diferent: totes dues funcionen i fan el mateix.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Quan falta el testimoni CSRF a la sol·licitud de formulari que s'està enviant o si sembla que no és vàlid, Laravel llança un missatge d'error "Pàgina caducada" amb un codi d'estat 419.
El middleware VerifyCsrfToken
gestiona la verificació CSRF dins de l'aplicació Laravel. El middleware
està registrat a Kernel.php
i es troba al directori app/Http/Middleware
. Això vol dir que el middleware
s'activa per a sol·licituds dins del web, no relacionades amb les API.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
El programari intermediari VerifyCsrfToken amplia la classe Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, és a dir, la verificació CSRF és defiencaixats dins l'aula.
Anem a aprofundir per esbrinar com Laravel gestiona la verificació CSRF.
Dins de la classe, tenim la funció tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
al codi determina si la sessió i els testimonis CSRF d'entrada coincideixen.
La funció fa dues coses:
$this->getTokenFromRequest
el testimoni de la sol·licitud entrant adjunt mitjançant un camp ocult o la capçalera de la sol·licitud. El testimoni es desxifra i després es torna a la variable del testimoni.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;
}
Al codi, rep un testimoni de la capçalera
2. Emet tant el testimoni de sol·licitud com la sessió a una cadena i, a continuació, utilitzeu-lo hash_equals
construït en PHP per comparar si les dues cadenes són iguals. El resultat d'aquesta operació és sempre bool (vertader) o (fals) .
Ercole Palmeri
Es va realitzar una operació d'oftalmoplàstia amb el visualitzador comercial Apple Vision Pro a la Policlínica de Catània...
El desenvolupament de la motricitat fina a través del color prepara els nens per a habilitats més complexes com escriure. Per acolorir...
El sector naval és una veritable potència econòmica mundial, que ha navegat cap a un mercat de 150 milions...
Dilluns passat, el Financial Times va anunciar un acord amb OpenAI. FT autoritza el seu periodisme de classe mundial...