Se­ve­ra­men­te vietato: chiunque visiti un sito web non deve as­so­lu­ta­men­te caricare ulteriori dati da server esterni! Ma ci possono essere delle eccezioni. Se entrambi i gestori di siti web con­cor­da­no sulla coo­pe­ra­zio­ne nulla impedisce un accordo. Il Cross-Origin Resource Sharing (CORS) re­go­la­men­ta tale coo­pe­ra­zio­ne. Ma come funziona?

Come funziona il CORS?

La same origin policy (SOP) vieta il ri­ca­ri­ca­men­to da altri server quando si visita un sito web. Tutti i dati devono provenire dalla stessa origine, quindi scaturire dallo stesso server. Questa è una misura di sicurezza in quanto Ja­va­Script e CSS possono caricare contenuti di altri server, anche contenuti dannosi, all’insaputa degli utenti. Tale tentativo di accesso viene definito Cross-origin request. Tuttavia, se entrambi gli operatori del sito web sono a co­no­scen­za dello scambio di dati e anzi lo ri­chie­do­no, la procedura può essere con­sen­ti­ta. Il server in­ter­pel­la­to ovvero quello da cui ri­ca­ri­ca­re i contenuti, consente l’accesso tramite il Cross-Origin Resource Sharing.

Tuttavia ciò accade sempre e solo per de­ter­mi­na­ti client. In altre parole CORS non è un la­scia­pas­sa­re per qualsiasi Cross-origin request. Anzi, il secondo server consente al primo l’accesso esclusivo tramite in­te­sta­zio­ne HTTP. Nell’in­te­sta­zio­ne della risposta HTTP è riportato con pre­ci­sio­ne quali server sono au­to­riz­za­ti a ri­ca­ri­ca­re i dati e infine a renderli di­spo­ni­bi­li per l’utente. Soltanto tramite l’in­te­gra­zio­ne di caratteri jolly è con­sen­ti­ta un’au­to­riz­za­zio­ne generale all’accesso da parte di tutti i client. Tuttavia ciò ha senso soltanto per i server che offrono quelle in­for­ma­zio­ni che do­vreb­be­ro essere di­spo­ni­bi­li al grande pubblico, ad esempio i font per il web.

L’utente, nel migliore dei casi, non ottiene nulla dallo scambio dei due server in­te­res­sa­ti. Tutti i browser attuali sup­por­ta­no CORS e l’invio di richieste e risposte avviene in back­ground, in bre­vis­si­mo tempo, quando viene ri­chia­ma­to un sito web.

Struttura delle in­te­sta­zio­ni CORS

In base alla same origin policy, le in­for­ma­zio­ni sull’origine di una con­nes­sio­ne al server sono co­sti­tui­te da tre elementi: host, porta e pro­to­col­lo. La direttiva impedisce pertanto che nell’esempio sopra riportato ’https://example.com’ acceda a ’http://example.com’ oppure a ’https://example.org’. Nel primo caso il pro­to­col­lo non è lo stesso, nel secondo i due dettagli relativi all’host non sono identici.

Una Cross-origin request è es­sen­zial­men­te una richiesta HTTP. Alcuni metodi non co­sti­tui­sco­no so­stan­zial­men­te un problema. GET e HEAD non possono mo­di­fi­ca­re i dati e pertanto non sono ge­ne­ral­men­te percepiti come una minaccia alla sicurezza. La si­tua­zio­ne è diversa per quanto riguarda PATCH, PUT o DELETE, che rendono possibile l’ese­cu­zio­ne di procedure dannose. È quindi ne­ces­sa­rio attivare in questo caso il Cross-Origin Resource Sharing. CORS può dunque contenere non solo in­for­ma­zio­ni sul­l'o­ri­gi­ne con­sen­ti­ta, ma anche in­for­ma­zio­ni su quali richieste HTTP sono con­sen­ti­te dall’origine.

Nel caso di metodi HTTP inerenti alla sicurezza il client inoltra in­nan­zi­tut­to una preflight request, in cui in realtà si specifica solo quale metodo HTTP verrà poi inviato al server e ci si domanda se la richiesta è con­si­de­ra­ta sicura. Per questo viene uti­liz­za­ta l’in­te­sta­zio­ne OPTIONS. Solo dopo una risposta positiva sarà possibile ef­fet­tua­re la richiesta effettiva.

Esistono diverse in­te­sta­zio­ni CORS che si occupano ri­spet­ti­va­men­te di aspetti diversi. Sono già state citate le due im­por­tan­ti in­te­sta­zio­ni per la de­ter­mi­na­zio­ne di origini sicure e metodi con­sen­ti­ti. Ma ce ne sono altre:

  • Access-Control-Allow-Origin: quale origine è con­sen­ti­ta?
  • Access-Control-Allow-Cre­den­tials: le richieste sono con­sen­ti­te anche se la modalità cre­den­zia­li è impostata su include?
  • Access-Control-Allow-Headers: quali in­te­sta­zio­ni possono essere uti­liz­za­te?
  • Access-Control-Allow-Methods: quali metodi di richiesta HTTP sono con­sen­ti­ti?
  • Access-Control-Expose-Headers: quali in­te­sta­zio­ni possono essere vi­sua­liz­za­te?
  • Access-Control-Max-Age: qual è il tempo massimo della preflight request prima che scada?
  • Access-Control-Request-Headers: quale in­te­sta­zio­ne HTTP è spe­ci­fi­ca­ta nella preflight request?
  • Access-Control-Request-Method: quale metodo HTTP è spe­ci­fi­ca­to nella preflight request?
  • Origin: qual è l’origine della richiesta?

Esempio di Cross-Origin Resource Sharing

Nel seguente esempio sup­po­nia­mo che l’host A (example.com) voglia inviare una DELETE request all’host B (example.org). A tal fine il server originale invia prima una preflight request:

/OPTIONS
Origin: http://example.com
Access-Control-Request-Method: DELETE

Se l’host B non ha problemi con questa Cross-origin request risponde con le in­te­sta­zio­ni CORS ap­pro­pria­te:

Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: PUT, POST, DELETE

Se le in­te­sta­zio­ni nella risposta non cor­ri­spon­do­no alle spe­ci­fi­che della richiesta o se il server in­ter­pel­la­to non risponde, nessuna Cross-origin request potrà essere eseguita.

Vantaggi e svantaggi di CORS

In realtà CORS serve a eludere un’im­po­sta­zio­ne di base in­trin­se­ca­men­te sicura, ovvero la same origin policy. La SOP è anche un mezzo efficace per impedire con­nes­sio­ni po­ten­zial­men­te pe­ri­co­lo­se. Tuttavia Internet si basa spesso proprio su tali Cross-origin requests poiché molte con­nes­sio­ni da un host all’altro sono piuttosto de­si­de­ra­te.

CORS offre quindi un percorso in­ter­me­dio: per le si­tua­zio­ni in cui le Cross-origin requests sono espli­ci­ta­men­te richieste, CORS può creare eccezioni. Esiste tuttavia il rischio che i gestori di siti web uti­liz­zi­no solo i caratteri jolly per motivi di praticità. Ciò si­gni­fi­che­reb­be negare qualsiasi pro­te­zio­ne da parte della SOP. È pertanto im­por­tan­te uti­liz­za­re CORS solo in casi speciali se­le­zio­na­ti e con­fi­gu­rar­lo nel modo più re­strit­ti­vo possibile.

Vai al menu prin­ci­pa­le