Node.js: gestire i cookie in modo sicuro in ExpressJS

Short link

Alcune pratiche raccomandate per gestire i cookie in modo sicuro in ExpressJS.

Per fare in modo che i cookie non espongano a rischi l’applicazione, non utilizzare il nome cookie della sessione predefinita e impostare le opzioni di sicurezza dei cookie in modo appropriato.

Esistono due moduli di sessione cookie middleware principali:

  • express-session che sostituisce il middleware express.session integrato a Express 3.x.
  • cookie-session che sostituisce il middleware express.cookieSession integrato a Express 3.x.

La differenza principale tra questi due moduli è nel modo in cui salvano i dati di sessione dei cookie. Il middleware express-session memorizza i dati di sessione sul server; salva l’ID sessione nello stesso cookie e non nei dati di sessione. Per impostazione predefinita, utilizza il processo di memorizzazione in-memory e non è progettato per un ambiente di produzione. Nella produzione, sarà necessario configurare un processo di memorizzazione della sessione scalabile; consultare l’elenco di compatible session stores.

Al contrario, il middleware cookie-session implementa la memorizzazione di backup dei cookie: suddivide in serie l’intera sessione per il cookie, piuttosto che una chiave di sessione. Utilizzarlo solo quando i dati di sessione sono relativamente piccoli e facilmente codificati come valori primitivi (piuttosto che oggetti). Poiché si presuppone che i browser supportino almeno 4096 byte per cookie, per non superare il limite, non superare la dimensione di 4093 byte per dominio. Inoltre, fare attenzione perché i dati dei cookie saranno visibili al cliente, quindi, se per qualche motivo devono rimanere sicuri o non visibili, la scelta di utilizzare express-session potrebbe essere quella giusta.

Non utilizzare il nome del cookie della sessione predefinito

L’utilizzo del nome del cookie della sessione predefinito potrebbe esporre l’applicazione ad attacchi da parte di hacker. Il problema di sicurezza messo in discussione è simile a quello di X-Powered-By: un potenziale hacker potrebbe utilizzarlo per individuare il server e indirizzare gli attacchi di conseguenza.

Per evitare questo problema, utilizzare i nomi dei cookie predefiniti; ad esempio, utilizzando il middleware express-session:


const session = require('express-session');
app.set('trust proxy', 1) // conferma il primo proxy
app.use( session({
   secret : 's3Cur3',
   name : 'sessionId',
  })
);

Impostare le opzioni di sicurezza dei cookie

Impostare le seguenti opzioni per i cookie per aumentarne la sicurezza:

  • secure - Assicura che il browser invii il cookie solo tramite HTTPS.
  • httpOnly - Assicura che il cookie venga inviato solo tramite HTTP, non JavaScript del client, questa procedura consentirà una protezione da attacchi XSS (cross-site scripting).
  • domain - Indica il dominio del cookie; utilizzarlo per fare un confronto con il dominio del server in cui è stato richiesto l’URL. Se corrispondono, come fase successiva verificare l’attributo del percorso.
  • path - Indica il percorso del cookie; utilizzarlo per fare un confronto con il percorso di richiesta. Se questo e il dominio corrispondono, inviare il cookie nella richiesta.
  • expires - Utilizzarlo per impostare la data di scadenza per i cookie permanenti.

Esempio di utilizzo del middleware cookie-session:


const session = require('cookie-session');
const express = require('express');
const app = express();

const expiryDate = new Date( Date.now() + 60 * 60 * 1000 ); // 1 ora
app.use(session({
  name: 'session',
  keys: ['key1', 'key2'],
  cookie: { secure: true,
            httpOnly: true,
            domain: 'example.com',
            path: 'foo/bar',
            expires: expiryDate
          }
  })
);

L'autore

Gabriele Romanato, sviluppatore web full stack specializzato in siti, applicativi web ed e-commerce con Node.js e PHP.