Protezione dalle vulnerabilità

Ogni tanto viene annunciata, o addirittura sfruttata, una grave falla di sicurezza su un altro sito importante. È spiacevole. Se vi sta a cuore la sicurezza delle vostre applicazioni web, il Nette Framework è senza dubbio la scelta migliore.

Cross-Site Scripting (XSS)

Il Cross-Site Scripting è un metodo per manomettere i siti web sfruttando gli output non sottoposti a escaping. Un attaccante può così inserire nella pagina codice proprio, modificando la pagina o addirittura ottenendo dati sensibili sui visitatori. La protezione dall'XSS richiede un escaping coerente e corretto di tutte le stringhe in uscita. Se il vostro sviluppatore se ne dimentica anche una sola volta, tutto il sito può essere compromesso.

Un esempio di attacco può essere fornire all'utente un URL modificato che inserisce del codice nella pagina. Se l'applicazione non esegue correttamente l'escaping degli output, lo script viene eseguito nel browser dell'utente. Così si può per esempio rubare la sua identità.

https://example.com/?search=<script>alert('Attacco XSS riuscito.');</script>

Il Nette Framework introduce la rivoluzionaria tecnologia Context-Aware Escaping, che elimina definitivamente il rischio di Cross-Site Scripting. Esegue automaticamente l'escaping di tutti gli output in base al contesto, così lo sviluppatore non può dimenticarsi nulla per sbaglio. Un esempio? Lo sviluppatore scrive questo template:

<p onclick="alert({$message})">{$message}</p>

<script>
document.title = {$message};
</script>

La notazione {$message} significa stampare una variabile. Negli altri framework bisogna eseguire l'escaping esplicito di ogni output, per di più in modo diverso in ogni punto. Nel Nette Framework non serve fare l'escaping di nulla, avviene tutto automaticamente, correttamente e in modo coerente. Se impostiamo la variabile $message = 'Larghezza 1/2"', il framework genera questo codice HTML:

<p onclick="alert(&quot;Larghezza 1\/2\&quot;&quot;)">Larghezza 1/2&quot;</p>

<script>
document.title = "Larghezza 1\/2\"";
</script>

Cross-Site Request Forgery (CSRF)

Un attacco Cross-Site Request Forgery consiste nell'attirare la vittima su una pagina che, di nascosto, esegue nel browser della vittima una richiesta verso un server su cui la vittima è connessa. Il server crede che la richiesta sia stata fatta volontariamente dalla vittima. Sotto l'identità della vittima esegue quindi un'azione a sua insaputa. Può trattarsi di modificare o cancellare dati, inviare un messaggio ecc.

Il Nette Framework protegge automaticamente form e segnali nei presenter da questo tipo di attacco, impedendo che vengano inviati o richiamati da un altro dominio. Se volete disattivare la protezione, per i form usate:

$form->allowCrossOrigin();

oppure, nel caso di un segnale, aggiungete l'attributo:

use Nette\Application\Attributes\Requires;

#[Requires(sameOrigin: false)]
public function handleXyz()
{
}

Questa protezione si basa sull'header Sec-Fetch-Site (Fetch Metadata), che il browser invia automaticamente e che non si può falsificare nemmeno con una vulnerabilità XSS lato server. L'articolo The browser finally solves CSRF lo descrive in dettaglio.

Attacco tramite URL, codici di controllo, UTF-8 non valido

Vari termini legati al tentativo di un attaccante di inserire nella vostra applicazione web input malevoli. Le conseguenze possono essere molto diverse, dal danneggiamento degli output XML (per esempio feed RSS non funzionanti) all'ottenimento di informazioni sensibili dal database o di password. La difesa è una validazione coerente a livello di byte di tutti gli input. E siamo onesti: quanti di voi lo fanno davvero?

Il Nette Framework lo fa per voi, automaticamente. Non dovete configurare nulla e tutti gli input verranno sanificati.

Session Hijacking, Session Stealing, Session Fixation

Alla gestione delle sessioni sono legati diversi tipi di attacco. L'attaccante o ruba il session ID, oppure ne impianta uno proprio all'utente, ottenendo così l'accesso all'applicazione web senza conoscere la password dell'utente. Può poi eseguire nell'applicazione qualsiasi azione all'insaputa dell'utente. La difesa sta nella corretta configurazione del server e di PHP.

Il Nette Framework configura PHP automaticamente. Il programmatore non deve quindi pensare a come proteggere correttamente la sessione e può concentrarsi pienamente sullo sviluppo dell'applicazione. Questo richiede però che la funzione ini_set() sia abilitata.

I cookie SameSite offrono un meccanismo per riconoscere che cosa ha portato al caricamento della pagina, il che è fondamentale per la sicurezza.

Il flag SameSite può avere tre valori: Lax, Strict e None (quest'ultimo richiede HTTPS). Se la richiesta di una pagina arriva direttamente dal sito, oppure l'utente apre la pagina digitandola nella barra degli indirizzi o cliccando un segnalibro, il browser invia al server tutti i cookie (cioè con i flag Lax, Strict e None). Se l'utente arriva al sito tramite un link da un altro sito, al server vengono passati i cookie con i flag Lax e None. Se la richiesta nasce in altro modo, per esempio dall'invio di un form POST da un'altra origine, dal caricamento dentro un iframe, tramite JavaScript ecc., vengono inviati solo i cookie con il flag None.

Nette invia per impostazione predefinita tutti i cookie con il flag Lax.

versione: 4.x