Articles

Laravel Web Security: què és la falsificació de sol·licituds entre llocs (CSRF)?

En aquest tutorial de Laravel parlem de la seguretat web i de com protegir una aplicació web dels atacs de falsificació de sol·licituds entre llocs o CSRF.

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.

Què és CSRF?

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.

Com prevenir les sol·licituds de CSRF

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 POSTPUTPATCHDELETE, 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.

Butlletí d'innovació
No et perdis les notícies més importants sobre innovació. Registra't per rebre'ls per correu electrònic.
<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.

Com i on es realitza la verificació CSRF

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:

  1. aconseguir $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

Butlletí d'innovació
No et perdis les notícies més importants sobre innovació. Registra't per rebre'ls per correu electrònic.

Articles recents

Intervenció innovadora en Realitat Augmentada, amb un visor Apple al Policlínic de Catània

Es va realitzar una operació d'oftalmoplàstia amb el visualitzador comercial Apple Vision Pro a la Policlínica de Catània...

3 maig 2024

Els avantatges de les pàgines per pintar per a nens: un món de màgia per a totes les edats

El desenvolupament de la motricitat fina a través del color prepara els nens per a habilitats més complexes com escriure. Per acolorir...

2 maig 2024

El futur és aquí: com la indústria naviliera està revolucionant l'economia global

El sector naval és una veritable potència econòmica mundial, que ha navegat cap a un mercat de 150 milions...

1 maig 2024

Els editors i OpenAI signen acords per regular el flux d'informació processada per la Intel·ligència Artificial

Dilluns passat, el Financial Times va anunciar un acord amb OpenAI. FT autoritza el seu periodisme de classe mundial...

30 2024 abril