Jak uzyskać adres MAC i adres IP podłączonego klienta w PHP?

136

Muszę znać adres MAC i adres IP klientów połączenia, jak mogę to zrobić w PHP?

Neveen
źródło
Adres IP czego? Klienta, który jest połączony?
Palantir,
1
Adres serwera czy gościa?
KiNgMaR
13
W jakim celu chcesz mieć adres MAC? Czy wiesz, że użytkownik może to zmienić?
Markiz Lorne
@EJP Mam przypadek użycia adresu MAC. Chcę udostępniać różne informacje w zależności od urządzenia, które wysyła żądanie do strony internetowej. Czy istnieje inny sposób na uzyskanie unikatowych informacji o urządzeniu, z którego pochodzi strona?
Dante

Odpowiedzi:

186

IP serwera

Możesz uzyskać adres IP serwera z $_SERVER['SERVER_ADDR'].

Adres MAC serwera

W przypadku adresu MAC można przeanalizować dane wyjściowe netstat -iew systemie Linux lub ipconfig /allWindows.

Adres IP klienta

Możesz uzyskać adres IP klienta z $_SERVER['REMOTE_ADDR']

Adres MAC klienta

Adres MAC klienta nie będzie dostępny z wyjątkiem jednej szczególnej sytuacji: jeśli klient znajduje się w tym samym segmencie sieci Ethernet co serwer.

Tak więc, jeśli budujesz jakiś system oparty na sieci LAN, a Twoi klienci w tym samym segmencie sieci Ethernet, możesz uzyskać adres MAC, analizując dane wyjściowe arp -n(linux) lub arp -a(windows).

Edycja : pytasz w komentarzach, jak uzyskać dane wyjściowe polecenia zewnętrznego - jednym ze sposobów jest użycie lewych apostrofów, np

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

Ale co, jeśli klienta nie ma w sieci LAN?

Cóż, nie masz szczęścia, chyba że możesz poprosić klienta o podanie tych informacji na ochotnika i przekazanie ich w inny sposób.

Paul Dixon
źródło
2
Jak uzyskać wyjście arp -a przy użyciu php?
Neveen
1
@paulDixon cześć, to jest stary post i zastanawiam się, czy istnieje nowy sposób uzyskania adresu Mac?
jcho360
@ jcho360 Nadal nie można uzyskać adresu MAC klienta. I tak nie spodziewam się, że to się stanie, ponieważ adres MAC nie ma wartości komunikacyjnej, a więc nie zostanie zachowany w nagłówku żądania.
Bearwulf
@Bearwulf bardzo dziękuję za odpowiedź, tak pomyślałem, czy istnieje sposób na zidentyfikowanie unikalnych komputerów podłączonych do witryny?
jcho360
6
@ jcho360 Osobiście użyłbym kombinacji adresu IP + Poproś o informacje i zrobię z nich skrót, na przykład md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Na pewno nie jest kuloodporny, ale to początek. Innym łatwiejszym i bezpieczniejszym sposobem jest ustawienie pliku cookie z unikalnym hashem. Korzystając z tego pliku cookie, za każdym razem masz pewność, który użytkownik łączy się z Twoją witryną.
Bearwulf,
24

Adres MAC klienta (w sensie komputera, który wysłał żądanie HTTP) jest nadpisywany przez każdy router między klientem a serwerem.

IP klienta jest dogodnie dostarczane do skryptu w $_SERVER['REMOTE_ADDR']. W niektórych scenariuszach, szczególnie jeśli serwer sieciowy znajduje się za proxy (np. Buforujący serwer proxy) $_SERVER['REMOTE ADDR'], zwróci adres IP serwera proxy , a często pojawi się dodatkowa wartość $_SERVER['HTTP_X_FORWARDED_FOR'], która zawiera adres IP oryginalnego klienta żądania.

Czasami, szczególnie gdy masz do czynienia z anonimowym serwerem proxy, nad którym nie masz kontroli, serwer proxy nie zwróci prawdziwego adresu IP, a jedyne, na co możesz mieć nadzieję, to adres IP serwera proxy.

Michał Tatarynowicz
źródło
9

Nie sądzę, aby można było uzyskać adres MAC w PHP, ale można uzyskać adres IP ze $_SERVER['REMOTE_ADDR']zmiennej.

RaYell
źródło
Wydaje mi się
adres mac jest widoczny tylko dla sieci lokalnych, możesz uzyskać dostęp do adresu MAC dowolnego urządzenia poza jego siecią lokalną, na przykład adres mac będzie przechowywany i widoczny w lokalnym routerze Wi-Fi, a poza nim wszystkie urządzenia w sieci będą będą używać i będą komunikowane z tym samym adresem IP, który router przetłumaczy z powrotem na adres mac i wyśle ​​go wewnętrznie.
Dheeraj Thedijje
7

Myślę, że w przypadku serwera Windows możesz użyć tego:

<?php
echo exec('getmac');
?>
Simos
źródło
2
<? php echo exec ('getmac'); ?> działa tylko w sieci LAN, ale ten pokazuje cały adres mac <system php ('getmac'); ?>
Giorgi Gogitidze
I windows10 też. Nie musisz też używać exectylko `echogetmac
SaidbakR
6

Wszystko, co musisz zrobić, to umieścić arp w innej grupie.

Domyślna:

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

Z poleceniem:

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

dostaniesz:

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

A ponieważ Apache jest demonem działającym pod adresem www-data użytkownika, może teraz wykonać to polecenie.

Więc jeśli teraz używasz skryptu PHP, np:

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

otrzymasz wynik arp -anpolecenia linux .

McJ
źródło
6
To daje tylko adresy MAC urządzeń w sieci lokalnej.
duskwuff -inactive-
1
Zmiana grupy arpbinarnej jest zbędna, www-datanadal ma uprawnienia do wykonywania z otherumode.
deed02392
1

W systemie Windows, jeśli użytkownik używa twojego skryptu lokalnie, będzie to bardzo proste:

<?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
źródło
0

Aby rozwiązać problem, możesz skorzystać z następującego rozwiązania:

$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
źródło
0

Możemy uzyskać adres MAC w Ubuntu w ten sposób w php

$ipconfig =   shell_exec ("ifconfig -a | grep -Po 'HWaddr \K.*$'");  
    // display mac address   
 echo $ipconfig;
Ajay
źródło
0

Uzyskiwanie adresu MAC za pomocą PHP: (testowane w Ubuntu 18.04) - Aktualizacja 2020

Oto kod:

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

Wynik:

{
    "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
źródło
0

Być może uzyskanie adresu Mac nie jest najlepszym podejściem do weryfikacji komputera klienta przez Internet. Zamiast tego rozważ użycie tokena, który jest przechowywany w przeglądarce klienta przy logowaniu administratora.

Dlatego klient może mieć ten token tylko wtedy, gdy administrator przyzna mu go za pośrednictwem przeglądarki. Jeśli token nie istnieje lub jest ważny, oznacza to, że maszyna klienta jest nieprawidłowa.

Rosue Walford
źródło
-1

Za pomocą tego kodu możesz uzyskać adres MAC lub adres fizyczny

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

Używałem eksplozji wiele razy, ponieważ shell_exec ("ipconfig / all") zwraca pełne szczegóły całej sieci. więc musisz podzielić jeden po drugim. po uruchomieniu tego kodu otrzymasz
swój adres MAC 00 - ## - ## - CV-12 // to jest fałszywy adres tylko do celów pokazowych.

Pankaj Kumar
źródło
-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;  

Działa to dla mnie w systemie Windows, podobnie jak ipconfig /allpolecenie systemu Windows.

Ashwin
źródło
5
Jeśli ta odpowiedź czegoś cię nauczy, miejmy nadzieję, że nie kopiuj / wklejaj kodu, którego nie rozumiesz. Nie robi tego, o co prosił PO.
tripleee
-2

pod linuxem używając iptables możesz logować do pliku każde żądanie do serwera WWW z adresem mac i ip. z php lookup ostatni element z adresem IP i uzyskaj adres mac.

Jak wspomniano, pamiętaj, że adres mac pochodzi z ostatniego routera w śledzeniu.

TexWiller
źródło
-4

Możesz to łatwo zrobić za pomocą openWRT. Jeśli korzystasz z portalu dostępowego, możesz mieszać php i openWRT i tworzyć relacje między adresem IP a komputerem Mac.

Możesz napisać prosty kod PHP za pomocą:

 $localIP = getHostByName(getHostName()); 

Później, korzystając z openWRT, do którego możesz przejść /tmp/dhcp.leases, otrzymasz coś z formularzem:

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

Tam masz mac, adres IP i nazwę hosta.

Bernat Pedrol Vozmediano
źródło