Comment puis-je obtenir l'adresse IP du client en utilisant PHP?
Je veux garder trace de l'utilisateur qui s'est connecté à mon site Web via son adresse IP.
Comment puis-je obtenir l'adresse IP du client en utilisant PHP?
Je veux garder trace de l'utilisateur qui s'est connecté à mon site Web via son adresse IP.
Quoi que vous fassiez, assurez-vous de ne pas confiance aux données envoyées par le client. $_SERVER['REMOTE_ADDR']
contient l'adresse IP réelle de la connexion de partie. Qui est le plus fiable de la valeur que vous pouvez trouver.
Cependant, ils peuvent être derrière un serveur proxy auquel cas le proxy peut définir l' $_SERVER['HTTP_X_FORWARDED_FOR']
, mais cette valeur est facilement usurpée. Par exemple, il peut être défini par quelqu'un sans un proxy, ou l'IP peut être une adresse IP interne de la LAN derrière le proxy.
Cela signifie que si vous allez économiser de l' $_SERVER['HTTP_X_FORWARDED_FOR']
, assurez-vous également d' économiser de l' $_SERVER['REMOTE_ADDR']
de la valeur. E. g. en enregistrant à la fois des valeurs dans les différents champs de votre base de données.
Si vous allez économiser de l'adresse IP à une base de données sous forme de chaîne, assurez-vous d'avoir de l'espace pour au moins 45 caractères. IPv6 est ici pour rester et ces adresses sont plus grandes que les anciennes adresses IPv4.
(À noter que le protocole IPv6 utilise habituellement 39 caractères au plus, mais il y a également une IPv6 de notation pour les adresses IPv4 qui, dans sa forme complète peut être jusqu'à 45 caractères. Donc, si vous savez ce que vous faites, vous pouvez utiliser 39 caractères, mais si vous souhaitez simplement régler et oublier, 45).
Belle réponse ! J'utilise déjà $_SERVER['REMOTE_ADDR'] pour mon serveur, et j'aime le fait que vous ayez inclus une autre méthode, ainsi que les avantages et les inconvénients.
Remarque : REMOTE_ADDR
pourrait no contient l'adresse IP réelle de la connexion TCP. Cela dépend entièrement de votre SAPI. Assurez-vous que votre SAPI est correctement configuré de telle sorte que $_SERVER['REMOTE_ADDR']
renvoie en fait l'IP de la connexion TCP. Si ce n'est pas le cas, cela peut donner lieu à de sérieuses vulnérabilités, par exemple, StackExchange avait l'habitude d'accorder des droits d'accès à accès administrateur en vérifiant REMOTE_ADDR
pour voir s'il correspond à "localhost", malheureusement la configuration de SAPI ...........................................................................
..........................................................................had une vulnérabilité (il faut HTTP_X_FORWARDED_FOR
en entrée) qui permet à des non-administrateurs d'obtenir un accès administrateur en modifiant le fichier HTTP_X_FORWARDED_FOR
en-tête. Voir aussi blog.ircmaxell.com/2012/11/anatomie de l'attaque-comment-i-hacked.html
$_SERVER['REMOTE_ADDR']
peut ne pas contenir les adresses IP réelles des clients, car il vous donnera une adresse proxy pour les clients connectés par l'intermédiaire d'un proxy, par exemple. Il se peut que ce soit ce que vous voulez vraiment. ce que vous voulez vraiment, en fonction de ce que vous faites avec les adresses IP. L'adresse privée RFC1918 de quelqu'un peut ne pas vous être utile si vous essayez, par exemple, de savoir d'où provient votre trafic ou si vous vous souvenez de la dernière adresse IP à partir de laquelle l'utilisateur s'est connecté, alors que l'adresse IP publique du proxy ou de la passerelle NAT pourrait être plus appropriée à stocker.
Il existe plusieurs en-têtes HTTP comme X-Forwarded-For
qui peut ou non être défini par divers mandataires. Le problème est qu'il s'agit simplement d'en-têtes HTTP qui peuvent être définis par n'importe qui. Il n'y a aucune garantie quant à leur contenu. $_SERVER['REMOTE_ADDR']
est l'adresse IP physique réelle à partir de laquelle le serveur web a reçu la connexion et à laquelle la réponse sera envoyée. Tout le reste n'est qu'une information arbitraire et facultative. Il n'y a qu'un seul scénario dans lequel vous pouvez faire confiance à cette information : vous contrôlez le proxy qui définit cet en-tête. En d'autres termes, vous ne devez tenir compte de cette information que si vous savez à 100 % où et comment l'en-tête a été défini.
Ceci dit, voici un exemple de code :
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
Note de l'éditeur : En utilisant le code ci-dessus, on obtient implications en matière de sécurité . Le client peut définir toutes les informations de l'en-tête HTTP (ie. $_SERVER['HTTP_...
) à n'importe quelle valeur arbitraire. Il est donc beaucoup plus fiable d'utiliser $_SERVER['REMOTE_ADDR']
car elle ne peut pas être définie par l'utilisateur.
De : http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html
N'utilisez PAS le code ci-dessus si vous ne savez pas EXACTEMENT ce qu'il fait ! J'ai vu des failles de sécurité MASSIVES à cause de cela. Le client peut définir l'option X-Forwarded-For
ou le Client-IP
à n'importe quelle valeur arbitraire. À moins de disposer d'un proxy inverse de confiance, vous ne devez utiliser aucune de ces valeurs.
En ce qui concerne le commentaire de Janoszen, une option est la fonction PHP filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP).
X-Forwarded-For
peut contenir plusieurs adresses IP, séparées par une virgule, et doit être "analysé" plutôt que pris au pied de la lettre (AFAIK, il est presque impossible de le faire). jamais contient une seule adresse IP).
En fait, je veux connaître l'adresse IP du client qui utilise mon site web. Je ne veux pas connaître l'adresse IP du serveur où mes pages ont été téléchargées ou exécutées Merci de m'aider.
Ma solution préférée est celle qu'utilise Zend Framework 2. Il prend également en compte le $_SERVER
propriétés HTTP_X_FORWARDED_FOR
, HTTP_CLIENT_IP
, REMOTE_ADDR
mais il déclare une classe pour définir des proxies de confiance et il renvoie une adresse IP et non un tableau. Je pense que c'est la solution qui s'en rapproche le plus :
class RemoteAddress
{
/**
* Whether to use proxy addresses or not.
*
* As default this setting is disabled - IP address is mostly needed to increase
* security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
* just for more flexibility, but if user uses proxy to connect to trusted services
* it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
*
* @var bool
*/
protected $useProxy = false;
/**
* List of trusted proxy IP addresses
*
* @var array
*/
protected $trustedProxies = array();
/**
* HTTP header to introspect for proxies
*
* @var string
*/
protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';
// [...]
/**
* Returns client IP address.
*
* @return string IP address.
*/
public function getIpAddress()
{
$ip = $this->getIpAddressFromProxy();
if ($ip) {
return $ip;
}
// direct IP address
if (isset($_SERVER['REMOTE_ADDR'])) {
return $_SERVER['REMOTE_ADDR'];
}
return '';
}
/**
* Attempt to get the IP address for a proxied client
*
* @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
* @return false|string
*/
protected function getIpAddressFromProxy()
{
if (!$this->useProxy
|| (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
) {
return false;
}
$header = $this->proxyHeader;
if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
return false;
}
// Extract IPs
$ips = explode(',', $_SERVER[$header]);
// trim, so we can compare against trusted proxies properly
$ips = array_map('trim', $ips);
// remove trusted proxy IPs
$ips = array_diff($ips, $this->trustedProxies);
// Any left?
if (empty($ips)) {
return false;
}
// Since we've removed any known, trusted proxy servers, the right-most
// address represents the first IP we do not know about -- i.e., we do
// not know if it is a proxy server, or a client. As such, we treat it
// as the originating IP.
// @see http://en.wikipedia.org/wiki/X-Forwarded-For
$ip = array_pop($ips);
return $ip;
}
// [...]
}
Voir le code complet ici : https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php
Excellente réponse ! Utiliser un code testé en production, développé et utilisé dans un cadre aussi important est l'une des meilleures choses que vous puissiez faire :)
Alors attendez, zend ne filtre rien ? Je devrais voir quelque chose comme : filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ;
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
3 votes
S
3 votes
A
3 votes
F
1 votes
Y A .