Muszę znać adres MAC i adres IP klientów połączenia, jak mogę to zrobić w PHP?
Muszę znać adres MAC i adres IP klientów połączenia, jak mogę to zrobić w PHP?
Odpowiedzi:
Możesz uzyskać adres IP serwera z $_SERVER['SERVER_ADDR']
.
W przypadku adresu MAC można przeanalizować dane wyjściowe netstat -ie
w systemie Linux lub ipconfig /all
Windows.
Możesz uzyskać adres IP klienta z $_SERVER['REMOTE_ADDR']
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 są 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];
}
}
Cóż, nie masz szczęścia, chyba że możesz poprosić klienta o podanie tych informacji na ochotnika i przekazanie ich w inny sposób.
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.
Nie sądzę, aby można było uzyskać adres MAC w PHP, ale można uzyskać adres IP ze $_SERVER['REMOTE_ADDR']
zmiennej.
Myślę, że w przypadku serwera Windows możesz użyć tego:
<?php
echo exec('getmac');
?>
exec
tylko `echogetmac
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 -an
polecenia linux .
arp
binarnej jest zbędna, www-data
nadal ma uprawnienia do wykonywania z other
umode.
Użyj tej klasy (https://github.com/BlakeGardner/php-mac-address)
Jest to klasa PHP do manipulacji adresami MAC w systemach operacyjnych Unix, Linux i Mac OS X. został napisany przede wszystkim w celu pomocy w fałszowaniu podczas audytów bezpieczeństwa sieci bezprzewodowej.
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);
?>
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;
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"
}
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.
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.
// 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 /all
polecenie systemu Windows.
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.