window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = finestra if (w.LeadBooster) { console.warn('LeadBooster esiste già') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() API Rails e CORS. Un pizzico di consapevolezza - The Codest
The Codest
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Industrie
    • Fintech e banche
    • E-commerce
    • Adtech
    • Tecnologia della salute
    • Produzione
    • Logistica
    • Automotive
    • IOT
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
Freccia indietro TORNA INDIETRO
2021-04-01
Sviluppo di software

API Rails e CORS. Un pizzico di consapevolezza

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Per uno sviluppatore esperto, questo testo potrebbe non essere affatto sorprendente, ma credo che molti degli articoli che ho letto sull'impostazione di CORS in Rails dicessero qualcosa del tipo: usate rack-cors, consentite a qualsiasi host di accedere all'API e (facoltativamente): dovreste prendere in considerazione qualcosa di diverso (rispetto al consentire qualsiasi host) in produzione.

La proposta codice era sempre vicino a quello sottostante:

config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
permettere di fare
origini ''
resource '', header: :any, methods: :any
fine
fine

e, purtroppo, questi testi difficilmente ci spiegavano cosa fare concretamente in produzione.

Me la cavo abbastanza bene con il copia-incolla (A volte scherzo sul fatto che le aziende potrebbero assumere un copy-paster di Stack Overflow.), nella misura in cui c'è un momento di "riflessione e adattamento" tra il "copia" e l'"incolla". Vorrei quindi spiegare meglio cosa stiamo facendo e come funziona nella vita reale.

Spero che non vi dispiaccia se inizio con una breve introduzione alla teoria dell'onore e poi passo agli esempi di Rails.

Introduzione

Partiamo dall'inizio. Per spiegare meglio le cose, ho diviso l'introduzione in tre parti. La prima parte illustrerà cos'è un'origine, il termine chiave per ciò che stiamo discutendo. La seconda riguarda la SOP, con una breve descrizione. E l'ultima parte parla della CORS stesso.

Che cos'è un'origine?

Secondo i documenti web MDN:

- L'origine del contenuto Web è definita dallo schema (protocollo), dall'host (dominio) e dalla porta dell'URL utilizzato per accedervi. Due oggetti hanno la stessa origine solo se lo schema, l'host e la porta corrispondono (fonte)

Sembra abbastanza chiaro, non è vero? Analizziamo due esempi tratti da MDN, per sicurezza.

  1. http://example.com/app1/index.html, http://example.com/app2/index.html

I due casi sopra citati hanno la stessa origine perché:

  • i loro schemi (http) sono gli stessi,
  • i loro domini (example.com) sono gli stessi,
  • le loro porte (implicite) sono le stesse.
  1. http://www.example.com, http://myapp.example.com

Questi due elementi hanno un'origine diversa perché i domini (www.example.com, myapp.example.com) sono diversi.

Spero che sia abbastanza chiaro. In caso contrario, si consiglia di consultare i documenti Web MDN per ulteriori esempi.

Che cos'è la SOP?

I documenti web MDN dicono (fonte):

- Il criterio della stessa origine è un meccanismo di sicurezza critico che limita il modo in cui un documento o uno script caricato da un'origine può interagire con una risorsa di un'altra origine. Aiuta a isolare i documenti potenzialmente dannosi, riducendo i possibili vettori di attacco.

- Le scritture cross-origin sono tipicamente consentite. Esempi sono i link, i reindirizzamenti e l'invio di moduli.

- L'incorporazione di origini incrociate è tipicamente consentita.

- Le letture incrociate sono in genere vietate, ma l'accesso alla lettura è spesso reso invisibile dall'embedding.
Utilizzo CORS per consentire l'accesso da un'origine all'altra

Come si può notare, nelle definizioni di SOP si parla molto di comportamento trasversale. Non c'è problema. Tutto ciò che dobbiamo sapere ora è che la stessa origine ha più privilegi e che possiamo allentare le regole per le origini incrociate usando CORS. E qui entra in gioco la prossima sezione.

Che cos'è il CORS?

Sulla base delle parole di MDN:

  • Il Cross-Origin Resource Sharing (CORS) è un meccanismo basato sulle intestazioni HTTP che consente a un server di indicare qualsiasi altra origine (dominio, schema o porta) diversa dalla propria da cui un browser dovrebbe consentire il caricamento delle risorse. CORS si basa anche su un meccanismo in base al quale i browser effettuano una richiesta di "preflight" al server che ospita la risorsa di origine incrociata, al fine di verificare che il server permetta la richiesta effettiva. In questo preflight, il browser invia delle intestazioni che indicano il metodo HTTP e le intestazioni che saranno utilizzate nella richiesta effettiva. (fonte).

Questo non è ancora sufficiente. Ciò che non è stato detto esplicitamente è che l'intestazione più importante quando si usa CORS è Controllo dell'accesso - Consenti origine:

  • Il Controllo dell'accesso - Consenti origine indica se la risposta può essere condivisa con il codice richiedente dell'origine indicata (fonte).

Bene, questo dovrebbe essere tutto. Nella vita reale, quando si configura CORS, in genere si configura il file ACAO prima l'intestazione.

Vita reale

Questo è tutto per quanto riguarda le definizioni. Torniamo a Rails e agli esempi reali.

Come configurare CORS in Rails?

Utilizzeremo sicuramente i rack-cors (come ci è stato detto). Ricordiamo il primo frammento, quello che viene fornito più spesso in altri articoli:


config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
permettere di fare
origini ''
resource '', header: :any, methods: :any
fine
fine

Il numero di opzioni è vasto o addirittura infinito, ma consideriamo queste due:

  • stiamo costruendo l'API che può essere utilizzata da client di browser di terze parti,
  • abbiamo la tipica separazione frontend/backend e vogliamo consentire ai nostri clienti fidati di accedere all'API.

API di costruzione a cui accedono clienti di terze parti

Se vi trovate di fronte alla prima opzione, probabilmente potreste optare per origini '*' - volete che altri costruiscano un client sulla base della vostra API e non sapete chi sono, giusto?

Tipica separazione frontend/backend

Se state sviluppando quest'ultima, probabilmente non volete che tutti facciano richieste cross-originarie alla vostra API. Piuttosto volete che:

  • consentire ai client di produzione di accedere all'API di produzione,
  • Lo stesso vale per l'allestimento,
  • lo stesso per localhost,
  • si potrebbe voler consentire alle app di revisione FE di accedere allo staging.

Utilizzeremo ancora i portapacchi (come ci è stato detto), ma a modo nostro.

Utilizziamo 2 variabili ENV: ORIGINI_CONSENTITE per le definizioni letterali dell'origine (un asterisco o un URL vero e proprio) e ORIGINE_CONSENTITA_REGEXPS per i modelli.

config/initializers/cors.rb

frozenstringliteral: true

toregexp = ->(stringa) { Regexp.new(stringa) }
hosts = [
*ENV.fetch('ALLOWEDORIGINS').split(','),
*ENV.fetch('ALLOWEDORIGINREGEXPS').split(';').map(&to_regexp)
]

Rails.application.config.middleware.insert_before 0, Rack::Cors do
consentire
origini(*hosts)

risorsa '*',
         metodi: %i[get post put patch delete options head],
         intestazioni: :qualsiasi

fine
fine

Cosa sta succedendo qui?

  1. Come si può notare, stiamo dividendo i valori definiti nelle variabili ENV con diversi separatori. Questo perché è meno probabile che il punto e virgola compaia nello schema di definizione dell'URL.
  2. I valori letterali sono pronti per l'uso, ma dobbiamo mappare i modelli in modo che siano istanze di Regexp.
  3. Poi, uniamo il tutto e permettiamo a questi host di accedere a qualsiasi risorsa con i metodi whitelisted utilizzati dalla nostra API.

Questo dovrebbe garantire una flessibilità sufficiente per definire i valori corretti negli ambienti di sviluppo, staging e produzione.

Conclusioni

Riassumiamo tutto quanto sopra in punti chiave:

  • utilizzare le variabili ENV per configurare CORS,
  • utilizzare espressioni regolari per consentire a origini diverse di accedere all'API di staging (ad esempio, per le applicazioni di revisione),
  • mettere sempre "pensa e aggiusta" tra "copia" e "incolla".

Ecco fatto. Buona giornata!

Per saperne di più:

Perché si dovrebbe (probabilmente) usare Typescript?

10 startup di New York da menzionare nel 2021

Articoli correlati

Sviluppo di software

Costruire applicazioni web a prova di futuro: le intuizioni del team di esperti di The Codest

Scoprite come The Codest eccelle nella creazione di applicazioni web scalabili e interattive con tecnologie all'avanguardia, offrendo esperienze utente senza soluzione di continuità su tutte le piattaforme. Scoprite come la nostra esperienza favorisce la trasformazione digitale e il business...

IL CANCRO
Sviluppo di software

Le 10 principali aziende di sviluppo software con sede in Lettonia

Scoprite le migliori aziende di sviluppo software della Lettonia e le loro soluzioni innovative nel nostro ultimo articolo. Scoprite come questi leader tecnologici possono aiutarvi a migliorare la vostra attività.

thecodest
Soluzioni per aziende e scaleup

Essenziali di sviluppo software Java: Guida all'outsourcing di successo

Esplorate questa guida essenziale sullo sviluppo di software Java con successo outsourcing per migliorare l'efficienza, accedere alle competenze e guidare il successo del progetto con The Codest.

thecodest
Sviluppo di software

La guida definitiva all'outsourcing in Polonia

L'aumento di outsourcing in Polonia è guidato dai progressi economici, educativi e tecnologici, che favoriscono la crescita dell'IT e un clima favorevole alle imprese.

IlCodesto
Soluzioni per aziende e scaleup

Guida completa agli strumenti e alle tecniche di audit IT

Gli audit IT garantiscono sistemi sicuri, efficienti e conformi. Per saperne di più sulla loro importanza, leggete l'articolo completo.

The Codest
Jakub Jakubowicz CTO e cofondatore

Iscrivetevi alla nostra knowledge base e rimanete aggiornati sulle competenze del settore IT.

    Chi siamo

    The Codest - Società internazionale di sviluppo software con centri tecnologici in Polonia.

    Regno Unito - Sede centrale

    • Ufficio 303B, 182-184 High Street North E6 2JA
      Londra, Inghilterra

    Polonia - Poli tecnologici locali

    • Parco uffici Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Ambasciata del cervello, Konstruktorska
      11, 02-673 Varsavia, Polonia

      The Codest

    • Casa
    • Chi siamo
    • Servizi
    • Case Studies
    • Sapere come
    • Carriera
    • Dizionario

      Servizi

    • Consulenza
    • Sviluppo di software
    • Sviluppo backend
    • Sviluppo Frontend
    • Staff Augmentation
    • Sviluppatori backend
    • Ingegneri del cloud
    • Ingegneri dei dati
    • Altro
    • Ingegneri QA

      Risorse

    • Fatti e miti sulla collaborazione con un partner esterno per lo sviluppo di software
    • Dagli Stati Uniti all'Europa: Perché le startup americane decidono di trasferirsi in Europa
    • Confronto tra gli hub di sviluppo Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filippine), Eurasia (Turchia)
    • Quali sono le principali sfide di CTO e CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condizioni di utilizzo del sito web

    Copyright © 2025 di The Codest. Tutti i diritti riservati.

    it_ITItalian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek it_ITItalian