Как я могу получить MAC и IP-адрес подключенного клиента в PHP? - PullRequest
130 голосов
/ 14 сентября 2009

Мне нужно знать MAC-адрес и IP-адрес подключенных клиентов, как я могу это сделать в PHP?

Ответы [ 12 ]

174 голосов
/ 14 сентября 2009

IP-адрес сервера

Вы можете получить IP-адрес сервера от $_SERVER['SERVER_ADDR'].

MAC-адрес сервера

Для MAC-адреса вы можете проанализировать вывод netstat -ie в Linux или ipconfig /all в Windows.

IP-адрес клиента

Вы можете получить IP-адрес клиента от $_SERVER['REMOTE_ADDR']

MAC-адрес клиента

Клиентский MAC-адрес будет вам недоступен, за исключением одного особого обстоятельства: , если клиент находится в том же сегменте Ethernet, что и сервер.

Итак, если вы строите какую-то систему на основе локальной сети, и ваши клиенты находятся на в одном и том же сегменте Ethernet, вы можете получить MAC-адрес, проанализировав вывод arp -n (linux) или arp -a (окна).

Редактировать : вы спрашиваете в комментариях, как получить вывод внешней команды - один из способов - использовать обратные галочки, например,

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

Но что, если клиент не находится в локальной сети?

Что ж, вам не повезло, если вы не можете заставить клиента добровольно передать эту информацию и передать ее другими способами.

22 голосов
/ 18 августа 2010

MAC-адрес клиента (в смысле компьютера, который выдал HTTP-запрос) перезаписывается каждым маршрутизатором между клиентом и сервером.

IP-адрес клиента удобно предоставляется сценарию в $_SERVER['REMOTE_ADDR'].В некоторых сценариях, особенно если ваш веб-сервер находится за прокси-сервером (т.е. прокси-сервером кэширования), $_SERVER['REMOTE ADDR'] вернет IP-адрес прокси , и будет дополнительное значение, часто $_SERVER['HTTP_X_FORWARDED_FOR'],содержит IP-адрес исходного запроса клиента.

Иногда, особенно когда вы имеете дело с анонимным прокси, который вы не контролируете, прокси не возвращает реальный IP-адрес, и все, на что вы можете надеяться - это IP-адрес прокси.

8 голосов
/ 14 сентября 2009

Не думаю, что вы можете получить MAC-адрес в PHP, но вы можете получить IP из переменной $_SERVER['REMOTE_ADDR'].

6 голосов
/ 20 августа 2016

Для Windows Server, я думаю, вы можете использовать это:

<?php
echo exec('getmac');
?>
6 голосов
/ 16 июля 2010

Все, что вам нужно сделать, это поместить arp в другую группу.

По умолчанию:

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

С командой:

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

вы получите:

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

И поскольку apache - это демон, работающий под пользовательскими данными www, теперь он может выполнять эту команду.

Так что, если вы сейчас используете скрипт PHP, например ::

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

вы получите вывод команды linux arp -an.

2 голосов
/ 05 ноября 2013

Используйте этот класс (https://github.com/BlakeGardner/php-mac-address)

Это класс PHP для манипулирования MAC-адресами поверх операционных систем Unix, Linux и Mac OS X. он был написан в первую очередь для того, чтобы помочь с подделкой для аудита безопасности беспроводной сети.

1 голос
/ 29 августа 2017

В Windows, если пользователь использует ваш скрипт локально, это будет очень просто:

<?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); 
?>
0 голосов
/ 19 августа 2018

Для решения вашей проблемы вы можете использовать следующее решение:

$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;
0 голосов
/ 26 мая 2018

Вы можете получить MAC Address или Physical Address , используя этот код

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

Я использовал разнесение много раз, потому что shell_exec ("ipconfig / all") возвращает полную информацию о всей сети. поэтому вы должны разделить по одному. когда вы запустите этот код, вы получите
ваш MAC-адрес 00 - ## - ## - CV-12 // это поддельный адрес только для показа.

0 голосов
/ 16 мая 2017

Вы можете сделать это легко, используя openWRT. Если вы используете портал авторизации, вы можете смешать php и openWRT и установить связь между IP и mac.

Вы можете написать простой код PHP, используя:

 $localIP = getHostByName(getHostName()); 

Позже, используя openWRT, вы можете перейти на /tmp/dhcp.leases, вы получите что-то с формой:

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

Там у вас есть mac, IP-адрес и имя хоста.

...