web-dev-qa-db-fra.com

Comment puis-je obtenir le MAC et l'adresse IP d'un client connecté en PHP?

J'ai besoin de connaître le MAC et l'adresse IP des clients connectés, comment puis-je faire cela en PHP?

132
Neveen

IP du serveur

Vous pouvez obtenir l'adresse IP du serveur auprès de $_SERVER['SERVER_ADDR'].

Adresse MAC du serveur

Pour l'adresse MAC, vous pouvez analyser le résultat de netstat -ie sous Linux ou de ipconfig /all sous Windows.

Adresse IP du client

Vous pouvez obtenir l'adresse IP du client à partir de $_SERVER['REMOTE_ADDR']

Adresse MAC du client

L'adresse MAC du client ne sera pas disponible sauf dans un cas particulier: si le client se trouve sur le même segment Ethernet que le serveur.

Ainsi, si vous construisez un système basé sur un réseau local et que vos clients sont sur le même segment Ethernet, vous pouvez obtenir l'adresse MAC en analysant le sortie de arp -n (linux) ou arp -a (windows).

Edit: vous demandez dans les commentaires comment obtenir le résultat d'une commande externe - une façon consiste à utiliser des backticks, par exemple.

$ipAddress=$_SERVER['REMOTE_ADDR'];
$macAddr=false;

#run the external command, break output into lines
$arp=`arp -a $ipAddress`;
$lines=explode("\n", $arp);

#look for the output line describing our IP address
foreach($lines as $line)
{
   $cols=preg_split('/\s+/', trim($line));
   if ($cols[0]==$ipAddress)
   {
       $macAddr=$cols[1];
   }
}

Mais que se passe-t-il si le client n'est pas sur un réseau local?

Eh bien, vous n’avez pas de chance, à moins que le client ne communique ces informations et les transmette par d’autres moyens.

177
Paul Dixon

L'adresse MAC d'un client (au sens de l'ordinateur qui a émis la requête HTTP) est écrasée par chaque routeur situé entre le client et le serveur.

L’adresse IP du client est fournie au script dans $_SERVER['REMOTE_ADDR']. Dans certains scénarios, en particulier si votre serveur Web est derrière un proxy (c'est-à-dire un proxy de mise en cache), $_SERVER['REMOTE ADDR'] renverra l'IP du proxy, et il y aura souvent une valeur supplémentaire, $_SERVER['HTTP_X_FORWARDED_FOR'], qui contient l'adresse IP du client de requête d'origine.

Parfois, en particulier lorsque vous traitez avec un proxy d’anonymisation que vous ne contrôlez pas, le proxy ne renvoie pas la véritable adresse IP et tout ce que vous pouvez espérer, c’est l’adresse IP du proxy.

22

Je ne pense pas que vous puissiez obtenir l'adresse MAC en PHP, mais vous pouvez obtenir l'adresse IP de la variable $_SERVER['REMOTE_ADDR'].

8
RaYell

Tout ce que vous avez à faire est de placer arp dans un groupe différent.

Défaut:

-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*

Avec commande:

Sudo chown root:www-data /usr/sbin/arp

tu auras:

-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*

Et comme Apache est un démon fonctionnant sous l'utilisateur www-data, il est maintenant capable d'exécuter cette commande.

Donc, si vous utilisez maintenant un script PHP, par exemple:

<?php
$mac = system('arp -an');
echo $mac;
?>

vous obtiendrez le résultat de la commande linux arp -an.

6
McJ

Pour Windows Server, je pense que vous pouvez utiliser ceci:

<?php
echo exec('getmac');
?>
6
Simos

tilisez cette classe (https://github.com/BlakeGardner/php-mac-address)

Il s'agit d'une classe PHP pour la manipulation d'adresses MAC au-dessus des systèmes d'exploitation Unix, Linux et Mac OS X. il a été principalement conçu pour faciliter l'usurpation d'identité lors d'audits de sécurité sans fil.

2
Ali

Dans Windows, si l'utilisateur utilise votre script localement, ce sera très simple:

<?php
// get all the informations about the client's network
 $ipconfig =   Shell_exec ("ipconfig/all"));  
 // display those informations   
 echo $ipconfig;
/*  
  look for the value of "physical adress"  and use substr() function to 
  retrieve the adress from this long string.
  here in my case i'm using a french cmd.
  you can change the numbers according adress mac position in the string.
*/
 echo   substr(Shell_exec ("ipconfig/all"),1821,18); 
?>
1
Mirtov