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

136

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

Neveen
la source
Adresse IP de quoi? Du client connecté?
Palantir le
1
Adresse du serveur ou d'un visiteur?
KiNgMaR
13
Dans quel but voulez-vous l'adresse MAC? Savez-vous qu'il peut être modifié par l'utilisateur?
Marquis de Lorne
@EJP J'ai un cas d'utilisation pour l'adresse MAC. Je souhaite diffuser des informations différentes en fonction de l'appareil qui demande la page Web. Existe-t-il un autre moyen d'obtenir des informations uniques sur l'appareil demandant la page?
Dante

Réponses:

186

IP du serveur

Vous pouvez obtenir l'adresse IP du serveur à partir de $_SERVER['SERVER_ADDR'].

Adresse MAC du serveur

Pour l'adresse MAC, vous pouvez analyser la sortie de netstat -iesous Linux ou ipconfig /allsous 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 vous sera pas disponible sauf dans une circonstance particulière: si le client est sur le même segment Ethernet que le serveur.

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

Edit : vous demandez dans les commentaires comment obtenir la sortie d'une commande externe - une façon est d'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 faire si le client n'est pas sur un réseau local?

Eh bien, vous n'avez pas de chance si vous ne pouvez pas demander au client de fournir cette information et de la transmettre par d'autres moyens.

Paul Dixon
la source
2
Comment obtenir la sortie de arp -a en utilisant php ??
Neveen le
1
@paulDixon bonjour c'est un ancien message, et je me demande s'il existe une nouvelle façon d'obtenir l'adresse Mac?
jcho360
@ jcho360 Il n'est toujours pas possible d'obtenir l'adresse MAC d'un client. Je ne m'attends pas à le voir de toute façon car l'adresse MAC n'a aucune valeur de communication et ne sera donc pas conservée dans l'en-tête de la demande.
Bearwulf
@Bearwulf merci beaucoup pour la réponse, c'est ce que je pensais, y a-t-il un moyen d'identifier les ordinateurs uniques connectés à un site?
jcho360
6
@ jcho360 Personnellement, j'utiliserais une combinaison d'adresse IP + Demande d'informations et en ferais un hachage, par exemple md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Ce n'est certainement pas à l'épreuve des balles, mais c'est un début. Un autre moyen plus simple et sécurisé consiste à définir un cookie avec un hachage unique. Lorsque vous utilisez ce cookie à chaque fois, vous êtes sûr de l'utilisateur qui se connecte à votre site Web.
Bearwulf
24

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

L'adresse IP du client est commodément 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']il renverra l'IP du proxy , et il y aura souvent une valeur supplémentaire $_SERVER['HTTP_X_FORWARDED_FOR']qui contient l'IP du client de la requête d'origine.

Parfois, en particulier lorsque vous avez affaire à un proxy anonyme que vous ne contrôlez pas, le proxy ne renvoie pas la véritable adresse IP, et tout ce que vous pouvez espérer est l'adresse IP du proxy.

Michał Tatarynowicz
la source
9

Je ne pense pas que vous puissiez obtenir une adresse MAC en PHP, mais vous pouvez obtenir une adresse IP à partir d'une $_SERVER['REMOTE_ADDR']variable.

RaYell
la source
Vous pouvez obtenir l'adresse mac, je pense :)
Jitesh Sojitra
L'adresse mac est visible uniquement par les réseaux locaux, vous pouvez accéder à l'adresse mac de n'importe quel appareil en dehors de son réseau local, par exemple votre adresse mac sera stockée et visible dans votre routeur wifi local, et en dehors de celui-ci, tous les appareils de votre réseau seront utiliser et sera communiqué avec la même adresse IP, quel routeur se traduira en adresse mac et l'enverra en interne.
Dheeraj Thedijje
7

Pour le serveur Windows, je pense que vous pouvez utiliser ceci:

<?php
echo exec('getmac');
?>
Simos
la source
2
<? php echo exec ('getmac'); ?> cela ne fonctionne que sur le LAN, mais celui-ci affiche toutes les adresses mac <système php ('getmac'); ?>
Giorgi Gogitidze
Et windows10 aussi. De plus, vous ne devez pas utiliser execuniquement `echogetmac
SaidbakR
6

Tout ce que vous avez à faire est de mettre 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 s'exécutant 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 la sortie de la arp -ancommande linux .

McJ
la source
6
Cela ne vous donnera que les adresses MAC des appareils de votre réseau local.
duskwuff -inactif-
1
Changer le groupe du arpbinaire est redondant, www-datail a toujours des autorisations d'exécution de l' otherumode.
deed02392
1

Sous 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); 
?>
Mirtov
la source
0

Vous pouvez utiliser la solution suivante pour résoudre votre problème:

$mac='UNKNOWN';
foreach(explode("\n",str_replace(' ','',trim(`getmac`,"\n"))) as $i)
if(strpos($i,'Tcpip')>-1){$mac=substr($i,0,17);break;}
echo $mac;
AbdulRahman AlShamiri
la source
0

Nous pouvons obtenir l'adresse MAC dans Ubuntu de cette manière en php

$ipconfig =   shell_exec ("ifconfig -a | grep -Po 'HWaddr \K.*$'");  
    // display mac address   
 echo $ipconfig;
Ajay
la source
0

Obtenir l'adresse MAC à l'aide de PHP: (Testé dans Ubuntu 18.04) - Mise à jour 2020

Voici le code:

<?php
    $mac = shell_exec("ip link | awk '{print $2}'");
    preg_match_all('/([a-z0-9]+):\s+((?:[0-9a-f]{2}:){5}[0-9a-f]{2})/i', $mac, $matches);
    $output = array_combine($matches[1], $matches[2]);
    $mac_address_values =  json_encode($output, JSON_PRETTY_PRINT);   
    echo $mac_address_values
?>

Production:

{
    "lo": "00:00:00:00:00:00",
    "enp0s25": "00:21:cc:d4:2a:23",
    "wlp3s0": "84:3a:4b:03:3c:3a",
    "wwp0s20u4": "7a:e3:2a:de:66:09"
}
Smack Alpha
la source
0

Peut-être qu'obtenir l'adresse Mac n'est pas la meilleure approche pour vérifier la machine d'un client sur Internet. Envisagez d'utiliser un jeton à la place qui est stocké dans le navigateur du client par la connexion d'un administrateur.

Par conséquent, le client ne peut avoir ce jeton que si l'administrateur le lui accorde via son navigateur. Si le jeton n'est pas présent ou valide, la machine du client n'est pas valide.

Rosue Walford
la source
-1

Vous pouvez obtenir l' adresse MAC ou l' adresse physique en utilisant ce code

$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));  
$d1 = explode(':',$d[1]);  
$d2 = explode(' ',$d1[1]);  
return $d2[1];

J'ai utilisé exploser plusieurs fois parce que shell_exec ("ipconfig / all") renvoie les détails complets de tout le réseau. vous devez donc les séparer un par un. lorsque vous exécutez ce code, vous obtiendrez
votre adresse MAC 00 - ## - ## - CV-12 // c'est une fausse adresse pour le spectacle uniquement.

Pankaj Kumar
la source
-2
// Turn on output buffering  
ob_start();  

//Get the ipconfig details using system commond  
system('ipconfig /all');  

// Capture the output into a variable  
$mycomsys=ob_get_contents();  

// Clean (erase) the output buffer  
ob_clean();  

$find_mac = "Physical"; 
//find the "Physical" & Find the position of Physical text  

$pmac = strpos($mycomsys, $find_mac);  
// Get Physical Address  

$macaddress=substr($mycomsys,($pmac+36),17);  
//Display Mac Address  

echo $macaddress;  

Cela fonctionne pour moi sur Windows, tout comme la ipconfig /allcommande système Windows.

Ashwin
la source
5
Si cette réponse vous apprend quelque chose, ce serait, espérons-le, de ne pas copier / coller du code que vous ne comprenez pas. Il ne fait pas ce que le PO a demandé.
tripleee
-2

sous linux en utilisant iptables, vous pouvez enregistrer dans un fichier chaque demande au serveur Web avec l'adresse mac et l'ip. à partir du dernier élément de recherche php avec l'adresse IP et obtenir l'adresse mac.

Comme indiqué, rappelez-vous que l'adresse mac provient du dernier routeur sur la trace.

TexWiller
la source
-4

Vous pouvez le faire facilement en utilisant openWRT. Si vous utilisez un portail captif, vous pouvez mélanger php et openWRT et établir une relation entre l'IP et le mac.

Vous pouvez écrire un code PHP simple en utilisant:

 $localIP = getHostByName(getHostName()); 

Plus tard, en utilisant openWRT vous pouvez aller /tmp/dhcp.leases, vous obtiendrez quelque chose avec le formulaire:

 e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX 

Là, vous avez le mac, l'adresse IP et le nom d'hôte.

Bernat Pedrol Vozmediano
la source