web-dev-qa-db-fra.com

Quelle est la différence entre HTTP_CLIENT_IP et HTTP_X_FORWARDED_FOR?

Je comprends qu'un en-tête HTTP_X_FORWARDED_FOR est défini par les serveurs proxy pour identifier l'adresse IP de l'hôte qui effectue la demande HTTP via le proxy. J'ai entendu dire que l'en-tête HTTP_CLIENT_IP est défini à des fins similaires.

  1. Quelle est la différence entre HTTP_CLIENT_IP et HTTP_X_FORWARDED_FOR?
  2. Pourquoi l'une aurait-elle des valeurs différentes de l'autre?
  3. Où puis-je trouver des ressources sur la définition exacte de ces en-têtes.
60
Ethan Heilman

Aucun de ces en-têtes n'est officiellement normalisé. Par conséquent:

  1. What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR? - c'est impossible à dire. Différents mandataires peuvent les implémenter ou non. Les implémentations peuvent varier d'un proxy à l'autre, et elles peuvent ne pas l'être. L'absence d'un standard engendre des points d'interrogation.
  2. Why would one have different values than the other? - Voir point 1. Cependant, d'un point de vue purement pratique, la seule raison pour laquelle je peux voir qu'ils ont des valeurs différentes est si plus d'un proxy était impliqué - le X-Forwarded-For: l'en-tête peut alors contenir une trace complète de la chaîne de transfert, tandis que le Client-IP: l'en-tête contiendrait l'IP client réelle. Mais ce n'est là que pure spéculation.
  3. Where can I find resources on the exact definition of these headers. - Tu ne peux pas. Voir point 1.

Il semble y avoir ne sorte de standard de facto concernant le X-Forwarded-For: en-tête, mais étant donné qu'il n'y a pas de RFC qui le définit, cela ne peut pas être invoqué voir commentaire ci-dessous.

En remarque, le Client-IP: l'en-tête doit par convention être X-Client-IP: car il s'agit d'un en-tête "défini par l'utilisateur".

58
DaveRandom

Vous pouvez également essayer de cette façon:

if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $user_ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
    $user_ip = $_SERVER['HTTP_X_FORWARDED'];
} else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
    $user_ip = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_FORWARDED'])) {
    $user_ip = $_SERVER['HTTP_FORWARDED'];
} else if (isset($_SERVER['REMOTE_ADDR'])) {
    $user_ip = $_SERVER['REMOTE_ADDR'];
} else {
    $user_ip = null;
}
0
bharat