Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP: abilitare e configurare Cross-Origin Requests

CORS (Cross-Origin Resource Sharing): cos'è è perché permette la gestione sicura delle richieste cross-origin API nelle applicazioni PHP
CORS (Cross-Origin Resource Sharing): cos'è è perché permette la gestione sicura delle richieste cross-origin API nelle applicazioni PHP
Link copiato negli appunti

Quando sviluppiamo applicazioni web moderne, anche in PHP, spesso ci troviamo di fronte a una delle sfide più comuni: gestire le richieste Cross-Origin Resource Sharing (CORS). Si tratta di un meccanismo di sicurezza implementato dai browser per impedire che risorse web da un'origine (dominio) possano essere richieste da un'altra origine in modo non autorizzato. CORS è cruciale quando si lavora con API, microservizi o applicazioni web che devono interagire con risorse provenienti da domini differenti.

In questo articolo, capiremo come abilitare e configurare CORS in PHP (senza framework). Vedremo la teoria dietro il concetto di CORS, come abilitare la gestione delle richieste cross-origin con questo linguaggio e come personalizzare la configurazione per soddisfare le esigenze della tua applicazione.

Cos'è CORS?

CORS è un meccanismo che permette di consentire o bloccare le richieste da origini differenti da quella del server che ospita le risorse. Per esempio, se un'applicazione frontend su https://frontend.com vuole fare una richiesta a un'API su https://api.com, il browser deve controllare se l'API consente tale richiesta.

Come funziona CORS?

Quando una risorsa viene richiesta da un dominio diverso da quello del server, il browser invia una richiesta preflight (prima di inviare la richiesta principale), per verificare se il server consente le richieste CORS. Questo avviene inviando una richiesta HTTP OPTIONS, che include le informazioni sulla richiesta che si vuole fare, come i metodi HTTP (GET, POST, PUT, DELETE, ecc.) e gli header. Se il server è configurato per consentire la richiesta, risponde con gli header appropriati, come Access-Control-Allow-Origin.

Abilitare CORS in PHP

In PHP, la gestione di CORS non è inclusa di default, quindi è necessario configurarla manualmente. La configurazione di CORS in PHP viene fatta aggiungendo specifici header HTTP che il browser deve riconoscere per consentire le richieste cross-origin.

Abilitare l'intestazione Access-Control-Allow-Origin

Per consentire le richieste da origini specifiche, dobbiamo includere l'header Access-Control-Allow-Origin

Codice per abilitare tutte le origini:
// Permetti richieste da qualsiasi origine
header("Access-Control-Allow-Origin: *");

L'asterisco *

Codice per abilitare un'origine specifica:

// Permetti richieste solo da https://frontend.com
header("Access-Control-Allow-Origin: https://frontend.com");

Abilitare i metodi HTTP in PHP

Se la tua API deve supportare metodi HTTP come POST, PUT, DELETE, o PATCH, devi configurare anche l'header Access-Control-Allow-Methods. Ad esempio:

header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");

Questo header informa il browser su quali metodi sono consentiti per la richiesta cross-origin.

Abilitare gli header personalizzati

Se la tua applicazione invia header personalizzati nelle richieste, come ad esempio Authorization, devi anche includere l'header Access-Control-Allow-Headers. Ecco come puoi farlo:

header("Access-Control-Allow-Headers: Content-Type, Authorization");

Questo permette di inviare header personalizzati, come Authorization o Content-Type, che sono comuni quando si lavora con API RESTful.

Abilitare le credenziali

Se la tua applicazione richiede di inviare cookie o credenziali insieme alle richieste, devi configurare anche l'header Access-Control-Allow-Credentials:

header("Access-Control-Allow-Credentials: true");

Questo header indica che il server accetta credenziali (come i cookie) nelle richieste cross-origin. Quando è impostato a true, il browser invierà anche i cookie associati al dominio dell'origine.

Gestire la richiesta preflight con PHP

Quando il browser invia una richiesta preflight (una richiesta OPTIONS) per verificare le politiche CORS, devi restituire gli header appropriati per confermare che il server consente il tipo di richiesta specificata. Puoi gestirla richiesta nel modo seguente:

// Se è una richiesta OPTIONS (preflight), rispondi con gli header CORS
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
    header("Access-Control-Allow-Headers: Content-Type, Authorization");
    header("Access-Control-Max-Age: 3600"); // Opzionale: specifica per quanto tempo il risultato della richiesta preflight è valido
    exit(0);
}

Ritorno alla normale gestione delle richieste

Dopo aver gestito la richiesta preflight, il server può rispondere normalmente alla richiesta effettiva (ad esempio una GET, POST o PUT). È importante che il codice per la gestione delle risorse venga scritto normalmente, come si farebbe in un'applicazione PHP tradizionale.

Esempio completo di configurazione CORS in PHP

Combiniamo tutti i passaggi in un esempio pratico. Immagina di avere un file PHP che riceve delle richieste da un'applicazione frontend. Ecco come potrebbe apparire la configurazione completa:

// Gestione delle richieste CORS
// Abilitazione CORS
header("Access-Control-Allow-Origin: https://frontend.com"); // Sostituisci con il dominio desiderato
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Credentials: true"); // Se servono cookie o credenziali
// Gestione della richiesta OPTIONS (preflight)
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Max-Age: 3600"); // Cache della risposta
    preflight exit(0); // Termina la richiesta preflight
}
// Logica della tua API (gestione delle risorse)
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    // Esegui la logica per la richiesta
    GET echo json_encode(["message" => "GET request successful"]);
} elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Esegui la logica per la richiesta POST
    echo json_encode(["message" => "POST request successful"]);
}

In questo esempio, tutte le richieste provenienti da https://frontend.com sono permesse, e la logica di gestione delle richieste HTTP è divisa in base al metodo (GET, POST, ecc.).

Considerazioni sulla sicurezza

Sebbene CORS sia una funzionalità potente, è importante configurarlo correttamente per evitare rischi di sicurezza. Alcuni suggerimenti:

  • Evita di usare Access-Control-Allow-Origin: * in ambienti di produzione, soprattutto se le tue risorse contengono informazioni sensibili o se sono protette da autenticazione. Preferisci invece un'origine esplicitamente definita.
  • Gestisci correttamente le credenziali Access-Control-Allow-Credentials: true
  • Verifica e valida sempre i dati

Conclusione

Abilitare e configurare CORS in PHP è un processo relativamente semplice ma richiede attenzione per garantire che l'applicazione sia sicura e funzioni correttamente. Personalizzando gli header CORS, puoi avere un controllo completo sulle origini e sui metodi consentiti, nonché gestire le credenziali e le richieste preflight.

Per approfondire, ti consiglio di testare le tue configurazioni in diversi scenari e di consultare la documentazione ufficiale di PHP per altre funzionalità avanzate legate alle richieste HTTP. La gestione di CORS è una parte fondamentale della sicurezza e dell'ottimizzazione delle tue API, quindi è importante configurarla correttamente per evitare problemi in fase di sviluppo e produzione.

Ti consigliamo anche