J'ai besoin de connaître le MAC et l'adresse IP des clients de connexion, comment puis-je faire cela en PHP?
J'ai besoin de connaître le MAC et l'adresse IP des clients de connexion, comment puis-je faire cela en PHP?
Réponses:
Vous pouvez obtenir l'adresse IP du serveur à partir de $_SERVER['SERVER_ADDR']
.
Pour l'adresse MAC, vous pouvez analyser la sortie de netstat -ie
sous Linux ou ipconfig /all
sous Windows.
Vous pouvez obtenir l'adresse IP du client à partir de $_SERVER['REMOTE_ADDR']
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];
}
}
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.
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.
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.
Pour le serveur Windows, je pense que vous pouvez utiliser ceci:
<?php
echo exec('getmac');
?>
exec
uniquement `echogetmac
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 -an
commande linux .
arp
binaire est redondant, www-data
il a toujours des autorisations d'exécution de l' other
umode.
Utilisez 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 écrit pour aider à l'usurpation d'identité pour les audits de sécurité sans fil.
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);
?>
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;
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"
}
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.
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.
// 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 /all
commande système Windows.
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.
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.