Questo articolo del blog si concentra sui problemi di Cross-Origin Resource Sharing (CORS) che gli sviluppatori web incontrano frequentemente. Inizia spiegando cosa sia il CORS, i suoi principi fondamentali e perché sia importante. Successivamente, vengono analizzati in dettaglio come si manifestano gli errori CORS e i metodi che possono essere utilizzati per risolverli. Inoltre, vengono sottolineate le migliori pratiche e i punti importanti da considerare per un'applicazione CORS sicura ed efficace. Questa guida ha lo scopo di aiutarti a comprendere e risolvere i problemi relativi al CORS nelle tue applicazioni web.
Che cos’è CORS? Informazioni di Base e Importanza
Cross-Origin Resource Sharing (CORS) è un meccanismo di sicurezza che permette ai browser web di consentire a una pagina web di accedere a risorse provenienti da un dominio differente. In sostanza, regola l’accesso di un’applicazione web a risorse al di fuori del proprio dominio (ad esempio API, font, immagini). I browser, in base alla Same-Origin Policy (politica dello stesso origine), bloccano di default le richieste tra domini diversi. CORS fornisce un metodo sicuro per aggirare questa restrizione.
L’importanza del CORS nasce dalla complessità delle moderne applicazioni web e dalla necessità di estrarre dati da fonti differenti. Molte applicazioni web dipendono da API, CDN o altre risorse esterne ospitate su server diversi. Senza CORS, non sarebbe possibile accedere a queste risorse, limitando gravemente le funzionalità delle applicazioni web. CORS garantisce agli sviluppatori la flessibilità di ottenere dati da fonti differenti, mantenendo la sicurezza delle loro applicazioni.
La seguente tabella riassume i concetti chiave e il funzionamento di CORS:
| Concetto | Descrizione | Importanza |
|---|---|---|
| Same-Origin Policy (Politica dello stesso origine) | Impedisce agli script caricati da una fonte di accedere alle risorse di un’altra fonte. | Garantisce la sicurezza e previene l’accesso a dati sensibili da parte di script malevoli. |
| Richiesta Cross-Origin | Una richiesta HTTP effettuata da una pagina web a un dominio diverso dal proprio. | Permette alle moderne applicazioni web di accedere a diverse API e risorse. |
| Intestazioni CORS (CORS Headers) | Intestazioni speciali che il server aggiunge alle risposte per consentire le richieste cross-origin. | Indica al browser quali domini possono accedere alle risorse. |
| Richiesta Preflight | Richiesta che il browser invia al server utilizzando il metodo OPTIONS prima di effettuare richieste cross-origin complesse. | Permette al server di verificare se accettare o meno la richiesta. |
Il funzionamento di CORS si basa principalmente sul fatto che il server web comunica al browser, tramite le intestazioni HTTP della risposta, quali risorse possono essere accessibili. Il server indica con l’intestazione Access-Control-Allow-Origin quali domini possono accedere alle sue risorse. Se il dominio della richiesta è presente in questa intestazione o è specificato * (tutti), il browser accetta la richiesta. In caso contrario, il browser la blocca e viene generato un errore CORS.
- Elementi Fondamentali di CORS
- Access-Control-Allow-Origin: Specifica quali domini possono accedere alla risorsa.
- Access-Control-Allow-Methods: Indica quali metodi HTTP (GET, POST, PUT, DELETE, ecc.) possono essere utilizzati.
- Access-Control-Allow-Headers: Elenca le intestazioni speciali che possono essere incluse nella richiesta.
- Access-Control-Allow-Credentials: Determina se le credenziali (cookie, intestazioni di autorizzazione) possono essere incluse.
- Access-Control-Max-Age: Indica per quanto tempo i risultati delle richieste preflight possono essere memorizzati nella cache.
Gli errori CORS sono generalmente causati da una configurazione errata lato server. È importante che gli sviluppatori configurino i propri server in modo corretto, consentendo l’accesso alle risorse soltanto ai domini fidati. Inoltre, seguire le best practice relative al CORS aiuta a minimizzare le vulnerabilità di sicurezza.
CORS è una parte integrante delle moderne applicazioni web e offre flessibilità nell’estrazione di dati da diverse fonti, preservando la sicurezza. Se configurato correttamente, aumenta la funzionalità delle applicazioni web e migliora l’esperienza utente.
Principio di Funzionamento del Cross-Origin Resource Sharing
Cross-Origin Resource Sharing (CORS) è un meccanismo che consente ai browser web di permettere alle pagine web provenienti da un'origine (origin) di accedere a risorse situate su un'origine diversa. I browser applicano solitamente il principio della stessa origine (same-origin policy), il quale significa che una pagina web può accedere solo alle risorse che hanno lo stesso protocollo, host e porta. CORS è stato sviluppato per superare questa restrizione e per garantire la condivisione sicura dei dati tra fonti differenti.
L'obiettivo principale di CORS è garantire la sicurezza delle applicazioni web. Il principio della stessa origine impedisce ai siti web malevoli di accedere ai dati sensibili degli utenti. Tuttavia, in alcuni casi potrebbe essere necessario condividere dati tra fonti diverse. Ad esempio, un'applicazione web potrebbe dover accedere a un API su un server diverso. CORS offre una soluzione sicura per tali scenari.
| Campo | Descrizione | Esempio |
|---|---|---|
| Origin | L'indirizzo della fonte che ha originato la richiesta. | http://example.com |
| Access-Control-Allow-Origin | Indica a quali fonti il server consente l'accesso. | http://example.com, * |
| Access-Control-Request-Method | Indica quale metodo HTTP il client desidera utilizzare. | POST, GET |
| Access-Control-Allow-Methods | Indica a quali metodi HTTP il server concede l'accesso. | POST, GET, OPTIONS |
CORS funziona tramite una serie di intestazioni HTTP tra client (browser) e server. Quando il client effettua una richiesta cross-origin, il browser aggiunge automaticamente l'intestazione Origin alla richiesta. Il server esamina questa intestazione e decide se autorizzare la richiesta. Se il server concede l'autorizzazione, risponde con l'intestazione Access-Control-Allow-Origin. Questa intestazione specifica quali fonti possono accedere alla richiesta.
- Processo CORS
- Il browser richiede una risorsa da un'origine differente.
- Il browser aggiunge l'intestazione Origin alla richiesta.
- Il server valuta l'intestazione Origin.
- Il server risponde con l'intestazione Access-Control-Allow-Origin.
- Il browser verifica la risposta e permette o blocca la richiesta.
Comprendere il principio di funzionamento di CORS è di importanza critica per gli sviluppatori web. Una configurazione errata delle impostazioni CORS può causare vulnerabilità di sicurezza nelle applicazioni web. Per questo motivo, sapere come funziona CORS e come configurarlo correttamente è indispensabile per sviluppare applicazioni web sicure ed efficaci.
Processi di Autorizzazione
Nei processi di autorizzazione CORS, si determina a quali origini il server concede l'accesso. Tramite l'intestazione Access-Control-Allow-Origin, il server può consentire l'accesso a fonti specifiche o, utilizzando il carattere *, consentire l'accesso a tutte le fonti. Tuttavia, l'uso del carattere * comporta rischi di sicurezza, quindi occorre essere cauti. Soprattutto in presenza di dati sensibili, concedere l'accesso solo a fonti specifiche rappresenta un approccio più sicuro.
Errori e Soluzioni
Gli errori CORS derivano solitamente da una configurazione errata delle impostazioni del server. Uno degli errori più comuni è la mancanza o la configurazione non corretta dell'intestazione Access-Control-Allow-Origin. In questo caso, il browser blocca la richiesta e mostra un errore CORS. Per risolvere tali errori, è importante controllare le impostazioni del server e assicurarsi che l'intestazione Access-Control-Allow-Origin sia configurata correttamente. Inoltre, occorre verificare che le richieste OPTIONS, conosciute come preflight request, vengano gestite correttamente.
Metodi per Comprendere e Risolvere gli Errori CORS
Gli errori di Cross-Origin Resource Sharing (CORS) sono tra i problemi che gli sviluppatori web incontrano spesso e per cui spendono molto tempo nella risoluzione. Questi errori si verificano quando una pagina web cerca di richiedere una risorsa proveniente da una fonte diversa (dominio, protocollo o porta) e il browser blocca la richiesta per motivi di sicurezza. Comprendere e risolvere gli errori CORS è fondamentale per il funzionamento senza problemi delle applicazioni web moderne.
Diagnosticare gli errori CORS è il primo passo per determinare l'origine del problema. Utilizzare gli strumenti di sviluppo del browser (solitamente nella scheda Console) per analizzare i messaggi di errore aiuta a capire quale risorsa è stata bloccata e il motivo. I messaggi di errore contengono spesso indizi utili per risolvere il problema. Ad esempio, il messaggio No ‘Access-Control-Allow-Origin’ header is present on the requested resource indica che manca l'intestazione CORS dal lato server.
| Codice Errore | Descrizione | Soluzioni Possibili |
|---|---|---|
| 403 Forbidden | Il server ha compreso la richiesta ma l'ha rifiutata. | Controllate la configurazione CORS dal lato server. Configurate correttamente le risorse consentite. |
| 500 Internal Server Error | Si è verificato un errore imprevisto sul server. | Esaminate i log del server e individuate la causa dell'errore. Potrebbe esserci un problema con la configurazione CORS. |
| Errore CORS (Console del Browser) | Il browser ha bloccato la richiesta perché è stata violata la policy CORS. | Impostate correttamente l'intestazione ‘Access-Control-Allow-Origin’ dal lato server. |
| ERR_CORS_REQUEST_NOT_HTTP | La richiesta CORS non viene eseguita tramite protocollo HTTP o HTTPS. | Assicuratevi che la richiesta venga effettuata tramite il protocollo corretto. |
Esistono diversi metodi per risolvere gli errori CORS. Il modo più comune è aggiungere le intestazioni CORS necessarie dal lato server. L'intestazione ‘Access-Control-Allow-Origin’ indica quali fonti possono accedere al server. Impostare questa intestazione su ‘*’ significa permettere l'accesso da tutte le fonti, ma questo approccio non è generalmente consigliato per motivi di sicurezza. Piuttosto, consentire solo fonti specifiche è più sicuro. Ad esempio, ‘Access-Control-Allow-Origin: https://example.com’ permette richieste solo dall'indirizzo ‘https://example.com’.
Altri punti importanti per prevenire e risolvere gli errori CORS includono:
- Tipi di Errore
- Intestazione ‘Access-Control-Allow-Origin’ assente o configurata in modo errato: Mancata impostazione corretta delle intestazioni dal lato server.
- Problemi con la richiesta preliminare (preflight): La richiesta ‘OPTIONS’ non viene gestita correttamente dal server.
- Problemi di credenziali: Cookie o informazioni di autenticazione non vengono inviate correttamente.
- Problemi di reindirizzamento tra fonti: I reindirizzamenti non sono compatibili con le policy CORS.
- Problemi con il server proxy: I server proxy non trasmettono correttamente le intestazioni CORS.
- Obbligo del protocollo HTTPS: Le richieste effettuate tramite connessioni HTTP non sicure vengono bloccate.
Per risolvere gli errori CORS, oltre ai cambiamenti dal lato server, è possibile effettuare alcune impostazioni anche dal lato client. Ad esempio, si può utilizzare un server proxy per inoltrare le richieste oppure impiegare metodi alternativi di scambio dati come JSONP. Tuttavia, è importante ricordare che questi metodi possono generare vulnerabilità di sicurezza. Pertanto, la migliore soluzione è solitamente garantire una corretta configurazione CORS dal lato server.
Migliori Pratiche per CORS

Configurare correttamente la condivisione delle risorse Cross-Origin (CORS) è fondamentale per garantire la sicurezza e la funzionalità delle tue applicazioni web. Una politica CORS mal configurata può portare a vulnerabilità di sicurezza e consentire accessi non autorizzati. Per questo motivo, è importante prestare attenzione e seguire le migliori pratiche durante l’implementazione di CORS.
| Migliore Pratica | Descrizione | Importanza |
|---|---|---|
| Limitare gli Origin Consentiti | Specifica solo i domini affidabili nell’intestazione Access-Control-Allow-Origin. Evita di usare *. |
Aumenta la sicurezza, impedisce l’accesso non autorizzato. |
| Utilizzare le Credenziali Quando Necessario | Per inviare credenziali come cookie o intestazioni di autorizzazione, usa Access-Control-Allow-Credentials: true. |
Consente l’accesso alle risorse che richiedono autenticazione. |
| Gestire Correttamente le Richieste Preflight | Gestisci correttamente le richieste OPTIONS e fornisci le intestazioni necessarie (Access-Control-Allow-Methods, Access-Control-Allow-Headers). |
Permette l’esecuzione sicura di richieste complesse (ad esempio, PUT, DELETE). |
| Gestire con Attenzione i Messaggi di Errore | Notifica chiaramente gli errori CORS all’utente ed evita di esporre potenziali vulnerabilità di sicurezza. | Migliora l’esperienza utente e riduce i rischi di sicurezza. |
Per aumentare la sicurezza, evita di utilizzare il carattere jolly (*) nell’intestazione Access-Control-Allow-Origin. Questo permette a qualsiasi dominio di accedere alle tue risorse e consente potenzialmente a siti malevoli di rubare o manipolare i tuoi dati. Invece, elenca solo i domini specifici di cui ti fidi e ai quali vuoi consentire l’accesso.
- Passaggi di Implementazione
- Identifica le tue esigenze: Determina chiaramente quali domini devono accedere alle tue risorse.
- Configura l’intestazione
Access-Control-Allow-Origin: Sul lato server, elenca solo i domini consentiti. - Gestisci le credenziali: Se servono cookie o intestazioni di autorizzazione, configura correttamente l’intestazione
Access-Control-Allow-Credentials. - Gestisci le richieste preflight: Fornisci risposte appropriate alle richieste
OPTIONS. - Crea un meccanismo di gestione degli errori: Notifica chiaramente all’utente gli errori CORS.
- Testa e monitora: Testa regolarmente la configurazione CORS e monitora eventuali vulnerabilità di sicurezza.
Inoltre, gestire correttamente le richieste preflight è fondamentale. I browser inviano una richiesta OPTIONS al server prima di alcune richieste complesse (come PUT o DELETE). Il server deve rispondere correttamente a questa richiesta e includere le intestazioni Access-Control-Allow-Methods e Access-Control-Allow-Headers necessarie. Questo permette al browser di inviare la richiesta effettiva.
È importante testare e monitorare regolarmente la configurazione CORS. Prova diversi scenari per rilevare comportamenti inattesi o potenziali vulnerabilità di sicurezza. Inoltre, monitorando i log del server puoi individuare tentativi di accesso non autorizzato. Ricorda che creare un’applicazione web sicura è un processo continuo e necessita di aggiornamenti e miglioramenti costanti. Configurando correttamente la condivisione delle risorse Cross-Origin secondo queste migliori pratiche, puoi aumentare significativamente la sicurezza delle tue applicazioni web.
Accorgimenti nell’uso di CORS
Quando si utilizza il Cross-Origin Resource Sharing (CORS), ci sono numerosi punti importanti da tenere in considerazione per garantire la sicurezza e il corretto funzionamento della tua applicazione. CORS è un meccanismo che permette alle applicazioni web di scambiare dati da diverse origini, ma se configurato erroneamente può causare gravi vulnerabilità di sicurezza. Pertanto, è fondamentale configurare con attenzione le politiche CORS e seguire alcuni passaggi specifici per prevenire eventuali problemi.
Gli errori nella configurazione di CORS possono consentire l’accesso non autorizzato ai dati sensibili o facilitare attacchi malevoli. Ad esempio, una configurazione errata dell’intestazione Access-Control-Allow-Origin può autorizzare richieste provenienti da tutte le origini. Questa situazione rappresenta un grave rischio di sicurezza quando si dovrebbe consentire l’accesso solo a origini specifiche. La tabella seguente riassume gli errori più frequenti nella configurazione di CORS e le potenziali conseguenze.
| Errore | Descrizione | Conseguenza |
|---|---|---|
Utilizzo di Access-Control-Allow-Origin: * |
Consente richieste provenienti da tutte le origini. | Vulnerabilità di sicurezza, siti malevoli possono accedere ai dati. |
Utilizzo di Access-Control-Allow-Credentials: true con Access-Control-Allow-Origin: * |
Permette l’invio delle credenziali a tutte le origini (bloccato dai browser). | Comportamenti inattesi, autenticazione errata. |
| Autorizzazione a metodi HTTP non necessari | Si dovrebbero consentire solo metodi specifici come GET o POST, ma si permette l’uso di tutti i metodi. | Vulnerabilità potenziali, manipolazione dei dati. |
| Accettazione di intestazioni non necessarie | Dovrebbero essere consentite solo le intestazioni necessarie, ma si accettano tutte. | Vulnerabilità di sicurezza, trasferimento inutile di dati. |
Un altro aspetto fondamentale da considerare nell’uso di CORS è la corretta configurazione del meccanismo di preflight request. Le richieste preflight sono richieste OPTIONS inviate dai browser al server prima della richiesta effettiva, allo scopo di verificare le politiche CORS del server. Se il server non risponde correttamente a queste richieste, quella principale viene bloccata. È quindi essenziale assicurarsi che il server risponda adeguatamente alle richieste OPTIONS.
Punti da considerare
- Configurare correttamente l’intestazione
Access-Control-Allow-Origin. Consenti solo origini affidabili. - Usare con attenzione l’intestazione
Access-Control-Allow-Credentials. Evita di utilizzarla se non necessario. - Configura in modo corretto il meccanismo di preflight request. Rispondi adeguatamente alle richieste OPTIONS.
- Consenti solo i metodi HTTP e le intestazioni necessari. Blocca quelli superflui.
- Aggiorna regolarmente la configurazione CORS e verifica la presenza di vulnerabilità.
- Utilizza strumenti di debugging per identificare e correggere errori CORS.
Per risolvere gli errori CORS risulta molto utile utilizzare gli strumenti di sviluppo del browser. Questi strumenti mostrano errori e avvisi relativi a CORS, aiutando a individuare l’origine del problema. Inoltre, esaminando i log lato server, puoi verificare se le politiche CORS vengono applicate correttamente. Ricorda: una politica CORS configurata accuratamente rappresenta una componente essenziale per aumentare la sicurezza della tua applicazione web e migliorare l’esperienza dell’utente.
Domande Frequenti
Perché CORS è importante e come influenza il processo di sviluppo web?
CORS aumenta la sicurezza dei siti web impedendo a fonti malevoli di accedere a dati sensibili. Questo aiuta a proteggere le informazioni degli utenti e l’integrità dell’applicazione. Nel processo di sviluppo web, consente una condivisione controllata delle risorse tra differenti domini, offrendo un’esperienza sicura e stabile. È fondamentale che gli sviluppatori comprendano questo meccanismo per chiudere potenziali vulnerabilità di sicurezza e per sviluppare applicazioni senza problemi.
Come i browser applicano le politiche CORS e quali intestazioni HTTP sono utilizzate in questo processo?
I browser effettuano automaticamente controlli CORS quando una pagina web richiede risorse da un dominio diverso. In questo processo, il browser invia al server un'intestazione 'Origin'. Il server risponde con l'intestazione 'Access-Control-Allow-Origin'. Il browser confronta i valori di queste intestazioni per determinare se la richiesta sia sicura. Inoltre, intestazioni come 'Access-Control-Allow-Methods', 'Access-Control-Allow-Headers' e 'Access-Control-Allow-Credentials' sono utilizzate per indicare i metodi, le intestazioni e le credenziali consentite. Una corretta configurazione di queste intestazioni è importante per prevenire problemi di CORS.
Quali sono le cause più comuni degli errori CORS e come posso individuarli?
Tra le cause più comuni degli errori CORS vi sono una configurazione errata dell'intestazione 'Access-Control-Allow-Origin' sul server, richieste provenienti da porte o protocolli differenti, errori nelle preflight request (richieste preliminari), e gestione scorretta delle credenziali. Per individuare questi errori puoi utilizzare gli strumenti di sviluppo del browser (Developer Tools). I messaggi di errore visualizzati nella sezione Console di solito indicano la fonte del problema CORS. Inoltre, nella sezione Network puoi esaminare le intestazioni HTTP e verificare le risposte correlate al CORS dal server.
Cos’è una 'preflight request' (richiesta preliminare) e quando viene attivata?
La 'preflight request' è una richiesta OPTIONS che il browser invia al server per chiedere quali metodi HTTP e intestazioni verranno utilizzati, prima di inviare la richiesta vera e propria. Questa richiesta viene attivata in particolare quando vengono utilizzati metodi HTTP diversi da GET e POST (come PUT, DELETE ecc.) o quando vengono aggiunte intestazioni personalizzate. È necessario che il server risponda correttamente alla 'preflight request', altrimenti la richiesta principale verrà bloccata.
È possibile disabilitare o aggirare CORS e quali sono i potenziali rischi?
CORS è un meccanismo di sicurezza applicato lato browser. Dal lato server, puoi configurare le intestazioni CORS per controllare quali fonti hanno accesso. Disabilitare completamente CORS generalmente non è raccomandato, poiché renderebbe il tuo sito vulnerabile a diversi tipi di attacchi. Tuttavia, durante lo sviluppo o in specifici scenari di test, CORS può essere aggirato temporaneamente grazie ad estensioni del browser o proxy server. È importante che queste soluzioni temporanee non vengano utilizzate in ambiente di produzione.
Quali sono le vulnerabilità relative a CORS e quali misure dovremmo adottare per prevenirle?
Tra le vulnerabilità CORS più comuni vi sono l’impostare l’intestazione 'Access-Control-Allow-Origin' su '*' (consentendo l’accesso a chiunque) e permettere a siti malevoli di accedere alle credenziali. Per prevenire questi problemi, dovresti limitare l’intestazione 'Access-Control-Allow-Origin' solo ai domini autorizzati, usare con attenzione l’intestazione 'Access-Control-Allow-Credentials' e implementare ulteriori misure di sicurezza lato server (ad esempio, protezione CSRF).
Quali approcci sono disponibili per la configurazione CORS lato server e come posso scegliere quello più adatto?
Esistono diversi approcci per la configurazione CORS lato server. Tra questi vi sono l’impostazione manuale delle intestazioni HTTP, l’utilizzo di un middleware CORS o la configurazione di un web server (ad esempio, Nginx o Apache). L’approccio migliore dipende dalle necessità della tua applicazione, dalla tecnologia utilizzata e dall’infrastruttura server. L’uso di middleware offre soluzioni più flessibili e gestibili, mentre per applicazioni semplici può essere sufficiente una configurazione manuale delle intestazioni.
Come dovrei gestire le impostazioni CORS in diversi ambienti (sviluppo, test, produzione)?
Per gestire le impostazioni CORS in diversi ambienti puoi usare variabili di ambiente o file di configurazione. In ambiente di sviluppo, puoi utilizzare impostazioni più permissive (ad esempio, 'Access-Control-Allow-Origin: *') per ridurre gli errori CORS, ma queste impostazioni non devono essere usate in produzione. Nell’ambiente di test dovresti adottare regole CORS più rigorose che imitino quelle di produzione. In produzione, invece, limita l’intestazione 'Access-Control-Allow-Origin' solo ai domini autorizzati per ottenere la configurazione più sicura. Questo può essere realizzato creando file di configurazione separati per ciascun ambiente oppure utilizzando variabili di ambiente.