La gestion correcte des demandes CORS est un peu plus complexe. Voici une fonction qui répondra de manière plus complète (et correcte).
/**
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any
* origin.
*
* In a production environment, you probably want to be more restrictive, but this gives you
* the general idea of what is involved. For the nitty-gritty low-down, read:
*
* - https://developer.mozilla.org/en/HTTP_access_control
* - https://fetch.spec.whatwg.org/#http-cors-protocol
*
*/
function cors() {
// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
// Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
// you want to allow, and if so:
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
echo "You have CORS!";
}
Notes de sécurité
Lorsqu'un navigateur veut exécuter une requête intersite, il confirme d'abord que cela est possible en envoyant une requête "pré-vol" à l'URL. En autorisant CORS, vous indiquez au navigateur que les réponses de cette URL peuvent être partagées avec d'autres domaines.
CORS ne protège pas votre serveur. CORS tente de protéger vos utilisateurs en indiquant aux navigateurs les restrictions à appliquer au partage des réponses avec d'autres domaines. Normalement, ce type de partage est totalement interdit. CORS est donc un moyen de percer un trou dans la politique de sécurité normale du navigateur. Ces trous doivent être aussi petits que possible, aussi vérifiez toujours le HTTP_ORIGIN par rapport à une liste interne.
Il y a quelques dangers ici surtout si les données que l'URL sert sont normalement protégées. Vous autorisez effectivement le contenu du navigateur provenant d'un autre serveur à lire (et éventuellement à manipuler) les données de votre serveur.
Si vous comptez utiliser CORS, lisez attentivement le protocole (il est assez petit) et essayez de comprendre ce que vous faites. Une URL de référence est donnée dans l'exemple de code à cette fin.
Sécurité de l'en-tête
Il a été observé que l'en-tête HTTP_ORIGIN n'est pas sûr, et c'est vrai. En fait, tous les en-têtes HTTP sont peu sûrs, dans des sens différents du terme. À moins qu'un en-tête n'inclue une signature/hmac vérifiable, ou que toute la conversation ne soit authentifiée via TLS, les en-têtes ne sont que "quelque chose que le navigateur m'a dit".
Dans ce cas, le navigateur dit "un objet du domaine X veut obtenir une réponse de cette URL. Est-ce que c'est correct ?" L'intérêt de CORS est de pouvoir répondre "oui, je l'autorise".