Articoli

Sicurezza Web di Laravel: Che cos’è Cross-Site Request Forgery (CSRF) ?

In questo tutorial di Laravel parliamo di Sicurezza Web e come proteggere una applicazione web da Cross-Site Request Forgery o attacchi CSRF.

CSRF è un’attività dannosa compiuta da un utente malintenzionato, che esegue azioni per conto di un utente autenticato, a danno della sicurezza web. Fortunatamente, Laravel fornisce gli strumenti per prevenire questo tipo di vulnerabilità.

Cos’è CSRF?

Gli attacchi CSRF dirottano le sessioni utente. Lo fanno inducendo un utente a inviare una richiesta tramite tag di moduli nascosti o URL dannosi (immagini o collegamenti) all’insaputa dell’utente.

Questo attacco porta a un cambiamento nello stato della sessione utente, perdite di dati e a volte gli hacker possono manipolare i dati degli utenti finali in un’applicazione.

L’immagine sopra illustra uno scenario in cui la sicurezza web viene violata. La vittima invia una richiesta cliccando su un link (ricevuto), inviando una richiesta a un website server che produrrà effetti voluti dall’hacker, che entra in possesso delle informazioni utili per accedere e manipolare del website server.

Come prevenire le richieste CSRF

Per migliorare la sicurezza web delle tue applicazioni, in ogni sessione utente, Laravel genera token protetti che utilizza per garantire che l’utente autenticato sia quello che richiede l’applicazione.

Poiché questo token cambia ogni volta che viene rigenerata una sessione utente, un utente malintenzionato non può accedervi.

Ogni volta che c’è una richiesta di modifica delle informazioni dell’utente sul lato server (back-end) come POSTPUTPATCHDELETE, devi includere la direttiva @csrf nella richiesta del modulo blade HTML. Il @csrf è quindi una direttiva Blade utilizzata per generare un token nascosto convalidato dall’applicazione.

La direttiva Blade è la sintassi utilizzata all’interno del motore di modelli di Laravel chiamato Blade . Per creare un file blade bisogna dargli un nome – nel nostro caso form – seguito dall’estensione del blade. Ciò significa che il file avrà il nome form.blade.php.

Si utilizza il file blade per eseguire il rendering delle visualizzazioni per gli utenti sulla pagina Web. Ci sono un paio di direttive predefinite o sintassi abbreviate blade che puoi usare. Ad esempio, @if controlla se una condizione è soddisfatta, @empty controlla se i record non sono vuoti, @auth controlla se un utente è autenticato e così via.

Ma torniamo alla direttiva @csrf. Ecco come lo usi:

<form method="POST" action="{{route('pay')}}">

    @csrf
    
</form>

Le versioni precedenti di Laravel avevano una impostazione diversa: entrambi funzionano e fanno la stessa cosa.

Articoli correlati
Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

Quando il token CSRF non è presente nella richiesta del modulo che viene inviato o se sembra non valido, Laravel genera un messaggio di errore “Pagina scaduta” con un codice di stato 419.

Come e dove avviene la verifica CSRF

Il middleware VerifyCsrfToken gestisce la verifica CSRF all’interno dell’applicazione Laravel. Il middleware è registrato in Kernel.php e si trova nella directory app/Http/Middleware. Ciò significa che il middleware viene attivato per le richieste all’interno del Web, non correlate alle API.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

Il middleware VerifyCsrfToken estende la classe Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, cioè la verifica CSRF è definita all’interno della classe.

Approfondiamo per scoprire come Laravel gestisce la verifica CSRF.

All’interno della classe, abbiamo la funzione tokensMatch.

protected function tokensMatch($request)
{
     $token = $this->getTokenFromRequest($request);

     return is_string($request->session()->token()) &&
            is_string($token) &&
            hash_equals($request->session()->token(), $token);
}

nel codice determina se la sessione e i token CSRF di input corrispondono.

La funzione fa due cose:

  1. ricava $this->getTokenFromRequest il token dalla richiesta in arrivo allegata tramite un campo nascosto o l’intestazione della richiesta. Il token viene decrittografato e quindi restituito alla variabile 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;
}

Nel codice ottiene token dall’intestazione

2. Eseguire il cast sia del token di richiesta che della sessione su una stringa e quindi utilizzare hash_equals integrato in PHP per confrontare se entrambe le stringhe sono uguali. Il risultato di questa operazione è sempre bool (true) o (false) .

Ercole Palmeri

Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.

Articoli recenti

Nasce Nim, l’Osservatorio del Nord-Est sull’economia dell’innovazione

Nasce l’Osservatorio del Nordest sull’economia dell’Innovazione Nim, (Numbers Innovation Motion) è un progetto di Galileo Visionary District realizzato in collaborazione…

7 Dicembre 2023

Innovazione del Content Marketing con Memory e Personality

ASKtoAI lancia le innovative funzionalità Memory e Personality, strumenti d'avanguardia per la creazione di contenuti digitali che promettono di migliorare…

6 Dicembre 2023

Discuss apre una nuova era di ricerca qualitativa con GenAI ampliata e innovazione asincrona

Discuss , la piattaforma leader appositamente creata per trasformare le esperienze in insight, ha potenziato le sue capacità di scalare la…

6 Dicembre 2023

Unwrapping Innovation: Blue Lake Packaging annuncia un’alternativa a base di fibra e priva di plastica al nastro e ai dispenser tradizionali

Con le festività che si avvicinano rapidamente, Blue Lake Packaging è entusiasta di offrire un'alternativa ecologica al nastro da imballaggio…

6 Dicembre 2023

Riepilogo del Netlogistik Innovation Day: trasformazione digitale della catena del freddo, innovazioni nel riciclaggio e leadership nella supply chain

Netlogistik , leader in potenti servizi che guidano le aziende verso la trasformazione digitale della catena di fornitura, ha recentemente tenuto…

6 Dicembre 2023

Lattice collabora con NVIDIA per accelerare l’IA edge

Annuncia una soluzione integrata che combina FPGA di Lattice a bassa potenza e bassa latenza con la piattaforma NVIDIA Orin…

6 Dicembre 2023

Evoluzione del tessile: il progetto TEPP della Taiwan Textile Federation ispira l’innovazione sostenibile oltre il 2023

Con un successo clamoroso, il Textile Export Promotion Project (TEPP), guidato dalla Taiwan Textile Federation nel 2023, ha messo in…

5 Dicembre 2023

Lattice continua la rapida espansione del portafoglio di prodotti che rende possibile la prossima era dell’innovazione

Lattice presenta i nuovi FPGA mid-range Lattice Avant-G e Lattice Avant-X, stack di soluzioni specifiche per le applicazioni ampliate e…

5 Dicembre 2023

Scopri di più sulla gestione della conoscenza e sull’innovazione per gli studi legali con un nuovo trattato scritto da esperti

Innovazione per i professionisti della gestione della conoscenza e dell'innovazione (KM&I). Nel settore legale è ora disponibile un riferimento completo…

5 Dicembre 2023

La Fondazione Eclipse lancia il gruppo di lavoro Eclipse Dataspace per promuovere l’innovazione globale nella condivisione affidabile dei dati

La Eclipse Foundation , una delle più grandi fondazioni di software open source al mondo, ha annunciato oggi la formazione dell'Eclipse…

5 Dicembre 2023