web-dev-qa-db-fra.com

Comment puis-je obtenir l'origine de la demande avec PHP?

Si quelqu'un envoie une demande XHR de some-client.com à some-rest.com, je souhaite obtenir l'origine ( nom de domaine, pas l'adresse IP du client ) de la demande avec PHP.

Les solutions possibles:

  • Je peux peut-être utiliser $_SERVER['HTTP_Origin'] mais je ne sais pas s'il s'agit d'un standard.
  • Je vois un autre en-tête comme $_SERVER['HTTP_Host'] ou $_SERVER['SERVER_NAME'], mais dans certains cas, cela retourne la valeur réelle hostname et non la valeur réelle domain.
  • Et $_SERVER['REMOTE_ADDR'] donne l'adresse IP du client.

Quel est le bon moyen d’obtenir Origin of request comme un nom de domaine avec PHP?

Merci!

5
Olaf Erlandsen

Selon l'article Contrôle d'accès HTTP (CORS) par MDN:

Toutes les demandes doivent être définies sur Origin header pour fonctionner correctement sous le mécanisme CORS (partage de ressources d'origine croisée).

L'en-tête de demande " Origin " fait partie de RFC 6454 et le décrit comme faisant partie du mécanisme CORS et est compatible avec tous les navigateurs conformément au MDN.

Description par MDN:

L'en-tête de la requête Origin indique d'où provient l'extraction. Il n'inclut aucune information sur le chemin, mais uniquement le nom du serveur. Il est Envoyé avec les demandes CORS ainsi qu'avec POST demandes. Il est similaire À l'en-tête Referer, mais contrairement à cet en-tête, il ne divulgue pas Tout le chemin.

Source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

Exemple par MDN:  enter image description here

Donc, pour obtenir l'origine de la requête XHR avec PHP, vous pouvez utiliser:

$_SERVER['HTTP_Origin'] 

Et, dans le cas d'une demande directe, vous pouvez combinerHTTP_REFERER et REMOTE_ADDR comme:

if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

Donc, la solution finale possible est:

if (array_key_exists('HTTP_Origin', $_SERVER)) {
    $Origin = $_SERVER['HTTP_Origin'];
}
else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

MDN est Mozilla Developer Network .

Merci beaucoup pour l'aide @trine, @ waseem-bashir, @ p0lt10n et d'autres personnes.

11
Olaf Erlandsen

en php, vous pouvez obtenir en utilisant $ _SERVER ['HTTP_REFERER']. si vous utilisez codeigniter, vous pouvez obtenir le référant en utilisant $ this-> agent-> is_referral (). 

1
Waseem Bashir
$_SERVER['HTTP_Origin']  // HTTP Origin header
$_SERVER['HTTP_Host']    // HTTP Host header
$_SERVER['HTTP_REFERER'] // HTTP Referer header
$_SERVER['REMOTE_ADDR']  // HTTP Client's Public IP

Discutons ci-dessus des paramètres $_SERVER.

Premièrement, XHR est du côté client et est lié à un client http. Comme les en-têtes Origin et Referer ne sont pas obligatoires, un client autre que le navigateur Web standard ne le définira pas. L'en-tête de l'hôte suivant peut ne pas être obligatoire. Si votre serveur REST utilise des hôtes virtuels, cet en-tête est indispensable pour acheminer les demandes correctement. Mais cet en-tête ne contient aucun détail sur le client. La seule chose unique pour le client http est l’adresse IP publique. Mais cela correspond à de nombreux clients, car les fournisseurs d’accès utilisent des traductions d’adresses réseau ou des mandataires.

Puisque tout est relatif et dans les limites, les mécanismes CORS sont construits sur l’en-tête HTTP Origin. Les clients sont censés utiliser des navigateurs standard.

Dans votre cas, mon avis est qu'il est correct de dépendre de l'en-tête Origin. Vous pouvez implémenter le mécanisme CORS si cela vous convient.

1
TRiNE