Configurazione CORS errata: le trappole del wildcard e della riflessione
Il Cross-Origin Resource Sharing (CORS) controlla quali altri siti web possono leggere le risposte della tua API. Una policy con wildcard o con origine riflessa può permettere a qualsiasi sito di effettuare richieste autenticate e leggerne i risultati.
Che cos'è
I browser bloccano le letture cross-origin per impostazione predefinita. Gli header CORS allentano selettivamente questa regola. Access-Control-Allow-Origin: * apre le risposte a qualsiasi sito web.
Un bug più sottile è la riflessione dell'origine: il server rimanda nell'header allow-origin qualunque Origin fosse presente nella richiesta, il che di fatto si fida di tutti pur sembrando specifico.
Perché è importante
Se la tua API serve dati utente e consente le credenziali, una policy CORS troppo ampia permette a un sito dannoso di leggere i dati di una vittima connessa direttamente dalla tua API.
La riflessione combinata con Access-Control-Allow-Credentials: true è particolarmente pericolosa: vanifica la protezione same-origin che normalmente mantiene privati i dati degli utenti.
Come risolverlo
Valida l'Origin della richiesta rispetto a un elenco fisso di domini attendibili e solo allora rimandalo indietro.
const ALLOWED = new Set(["https://app.yourdomain.com"]);
const origin = req.headers.get("origin") ?? "";
const allow = ALLOWED.has(origin) ? origin : "";
// only set the header when allow is non-emptyI browser vietano Access-Control-Allow-Origin: * insieme alle credenziali, quindi le app a volte riflettono l'origine — ed è proprio questa la vulnerabilità. Usa invece una allowlist rigorosa.
Se un endpoint non ha bisogno di accesso cross-origin, non inviare alcun header CORS. Apri solo le route specifiche che ne hanno davvero bisogno.
FAQ
Access-Control-Allow-Origin: * è sempre un male?
Non per risorse davvero pubbliche e senza credenziali (ad es. un font pubblico o un'API di open data). È pericoloso per qualsiasi cosa legata a una sessione utente.
Il CORS protegge il mio server?
No: il CORS è applicato dal browser, non dal server. Governa ciò che il JavaScript di altri siti può leggere, non se una richiesta ti raggiunge.
La tua app è interessata?
AppSafe controlla questo e decine di altri problemi in un'unica scansione gratuita.
Scansiona la mia app gratisGuide correlate
I flag dei cookie Secure, HttpOnly e SameSite
Tre flag che impediscono il furto dei cookie di sessione.
Content-Security-Policy (CSP): cos'è e come aggiungerla
L'header che impedisce l'esecuzione degli script iniettati.
API key esposte nel JavaScript lato client
Tutto ciò che è nel tuo bundle è pubblico. Trattalo come tale.