Wie kann ich den MAC und die IP-Adresse eines verbundenen Clients in PHP erhalten?

136

Ich muss den MAC und die IP-Adresse der Verbindungsclients kennen. Wie kann ich das in PHP tun?

Neveen
quelle
IP-Adresse von was? Von dem Client, der verbunden ist?
Palantir
1
Adresse des Servers oder eines Besuchers?
KiNgMaR
13
Zu welchem ​​Zweck möchten Sie die MAC-Adresse? Ist Ihnen bewusst, dass es vom Benutzer geändert werden kann?
Marquis von Lorne
@EJP Ich habe einen Anwendungsfall für die MAC-Adresse. Ich möchte verschiedene Informationen basierend auf dem Gerät bereitstellen, das die Webseite anfordert. Gibt es eine andere Möglichkeit, eindeutige Informationen über das Gerät abzurufen, das die Seite anfordert?
Dante

Antworten:

186

Server IP

Sie können die Server-IP-Adresse von erhalten $_SERVER['SERVER_ADDR'].

Server-MAC-Adresse

Für die MAC-Adresse können Sie die Ausgabe unter netstat -ieLinux oder ipconfig /allWindows analysieren .

Client-IP-Adresse

Sie können die Client-IP von erhalten $_SERVER['REMOTE_ADDR']

Client-MAC-Adresse

Die Client-MAC-Adresse steht Ihnen nur unter bestimmten Umständen zur Verfügung: Wenn sich der Client im selben Ethernet-Segment wie der Server befindet.

Wenn Sie also eine Art LAN-basiertes System erstellen und Ihre Clients sich im selben Ethernet-Segment befinden, können Sie die MAC-Adresse erhalten, indem Sie die Ausgabe von arp -n(Linux) oder arp -a(Windows) analysieren .

Bearbeiten : Sie fragen in Kommentaren, wie Sie die Ausgabe eines externen Befehls erhalten. Eine Möglichkeit besteht darin, Backticks zu verwenden, z

$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];
   }
}

Aber was ist, wenn sich der Client nicht in einem LAN befindet?

Nun, Sie haben kein Glück, es sei denn, Sie können den Kunden diese Informationen freiwillig zur Verfügung stellen und auf andere Weise übermitteln lassen.

Paul Dixon
quelle
2
Wie bekomme ich die Ausgabe von arp -a mit PHP?
Neveen
1
@paulDixon Hallo, dies ist ein alter Beitrag, und ich frage mich, ob es einen neuen Weg gibt, um die Mac-Adresse zu erhalten.
jcho360
@ jcho360 Es ist immer noch nicht möglich, die MAC-Adresse eines Clients abzurufen. Ich erwarte sowieso nicht, dass dies passiert, da die MAC-Adresse keinen Kommunikationswert hat und daher nicht im Anforderungsheader gespeichert wird.
Bearwulf
@Bearwulf Vielen Dank für die Antwort. Ich dachte, gibt es eine Möglichkeit, eindeutige Computer zu identifizieren, die mit einer Site verbunden sind?
jcho360
6
@ jcho360 Persönlich würde ich eine Kombination aus IP-Adresse + Anforderungsinformationen verwenden und einen Hash daraus erstellen, zum Beispiel md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']);. Es ist definitiv nicht kugelsicher, aber es ist ein Anfang. Eine andere einfachere und sicherere Möglichkeit ist das Setzen eines Cookies mit einem eindeutigen Hash. Wenn Sie dieses Cookie jedes Mal verwenden, sind Sie sicher, welcher Benutzer eine Verbindung zu Ihrer Website herstellt.
Bearwulf
24

Die MAC-Adresse eines Clients (im Sinne des Computers, der die HTTP-Anforderung ausgegeben hat) wird von jedem Router zwischen dem Client und dem Server überschrieben.

Die Client-IP wird dem Skript in bequem zur Verfügung gestellt $_SERVER['REMOTE_ADDR']. In einigen Szenarien, insbesondere wenn sich Ihr Webserver hinter einem Proxy befindet (dh einem Caching-Proxy), $_SERVER['REMOTE ADDR']wird die IP des Proxys zurückgegeben , und es gibt häufig einen zusätzlichen Wert, der $_SERVER['HTTP_X_FORWARDED_FOR']die IP des ursprünglichen Anforderungsclients enthält.

Manchmal, insbesondere wenn Sie mit einem anonymisierenden Proxy arbeiten, den Sie nicht kontrollieren, gibt der Proxy nicht die tatsächliche IP-Adresse zurück, und Sie können nur auf die IP-Adresse des Proxys hoffen.

Michał Tatarynowicz
quelle
9

Ich glaube nicht, dass Sie MAC-Adresse in PHP erhalten können, aber Sie können IP von $_SERVER['REMOTE_ADDR']Variable erhalten.

RaYell
quelle
Sie können die Mac-Adresse bekommen, denke ich :)
Jitesh Sojitra
Die Mac-Adresse ist nur für lokale Netzwerke sichtbar. Sie können über das lokale Netzwerk auf die Mac-Adresse jedes Geräts zugreifen. Beispielsweise wird Ihre Mac-Adresse in Ihrem lokalen WLAN-Router gespeichert und angezeigt, und außerhalb davon werden alle Geräte in Ihrem Netzwerk angezeigt verwenden und mit derselben IP-Adresse kommuniziert werden, die der Router zurück in die Mac-Adresse übersetzt und intern sendet.
Dheeraj Thedijje
7

Für Windows Server denke ich, dass Sie dies verwenden können:

<?php
echo exec('getmac');
?>
Simos
quelle
2
<? php echo exec ('getmac'); ?> es funktioniert nur im LAN, aber dieses zeigt alle Mac-Adressen <PHP-System ('getmac'); ?>
Giorgi Gogitidze
Und Windows 10 auch. Außerdem müssen Sie nicht execnur `echogetmac
SaidbakR
6

Alles was Sie tun müssen, ist arp in eine andere Gruppe einzuteilen.

Standard:

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

Mit Befehl:

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

Sie erhalten:

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

Und da Apache ein Daemon ist, der unter dem Benutzer www-data ausgeführt wird, kann er diesen Befehl jetzt ausführen.

Wenn Sie jetzt ein PHP-Skript verwenden, z.

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

Sie erhalten die Ausgabe des Linux- arp -anBefehls.

McJ
quelle
6
Dadurch erhalten Sie nur die MAC-Adressen der Geräte in Ihrem lokalen Netzwerk.
Abenddämmerung -inaktiv-
1
Das Ändern der Gruppe der arpBinärdatei ist redundant und www-dataverfügt weiterhin über Ausführungsberechtigungen von der otherUmode.
Urkunde 02392
1

Wenn der Benutzer in Windows Ihr Skript lokal verwendet, ist dies sehr einfach:

<?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
quelle
0

Sie können die folgende Lösung verwenden, um Ihr Problem zu lösen:

$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
quelle
0

Wir können MAC-Adresse in Ubuntu auf diese Weise in PHP erhalten

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

Abrufen der MAC-Adresse mithilfe von PHP: (Getestet in Ubuntu 18.04) - Update 2020

Hier ist der 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
?>

Ausgabe:

{
    "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
quelle
0

Möglicherweise ist das Abrufen der Mac-Adresse nicht der beste Ansatz, um den Computer eines Clients über das Internet zu überprüfen. Verwenden Sie stattdessen ein Token, das durch die Anmeldung eines Administrators im Browser des Clients gespeichert wird.

Daher kann der Client dieses Token nur haben, wenn der Administrator es ihm über seinen Browser gewährt. Wenn das Token nicht vorhanden oder gültig ist, ist der Computer des Clients ungültig.

Rosue Walford
quelle
-1

Mit diesem Code können Sie die MAC- Adresse oder die physische Adresse abrufen

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

Ich habe explode oft verwendet, weil shell_exec ("ipconfig / all") vollständige Details des gesamten Netzwerks zurückgibt . Sie müssen also eins nach dem anderen teilen. Wenn Sie diesen Code ausführen, erhalten Sie
Ihre MAC-Adresse 00 - ## - ## - CV-12 // Dies ist eine gefälschte Adresse, die nur angezeigt werden soll.

Pankaj Kumar
quelle
-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;  

Dies funktioniert für mich unter Windows, ebenso ipconfig /allwie der Windows-Systembefehl.

Ashwin
quelle
5
Wenn diese Antwort Ihnen etwas lehrt, ist es hoffentlich nicht möglich, Code zu kopieren / einzufügen, den Sie nicht verstehen. Es macht nicht das, was das OP verlangt hat.
Tripleee
-2

Unter Linux mit iptables können Sie jede Anfrage an einen Webserver mit Mac-Adresse und IP in einer Datei protokollieren. von PHP Lookup letzten Artikel mit IP-Adresse und Mac-Adresse erhalten.

Denken Sie daran, dass die Mac-Adresse vom letzten Router in der Ablaufverfolgung stammt.

TexWiller
quelle
-4

Sie können dies einfach mit openWRT tun. Wenn Sie ein Captive-Portal verwenden, können Sie PHP und OpenWRT mischen und eine Beziehung zwischen der IP und dem Mac herstellen.

Sie können einen einfachen PHP-Code schreiben mit:

 $localIP = getHostByName(getHostName()); 

Wenn Sie später openWRT verwenden /tmp/dhcp.leases, erhalten Sie etwas mit dem Formular:

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

Dort haben Sie den Mac, die IP-Adresse und den Hostnamen.

Bernat Pedrol Vozmediano
quelle