Мне нужно знать MAC-адрес и IP-адрес подключенных клиентов, как я могу сделать это на PHP?
Мне нужно знать MAC-адрес и IP-адрес подключенных клиентов, как я могу сделать это на PHP?
Ответы:
Вы можете получить IP-адрес сервера от $_SERVER['SERVER_ADDR']
.
Для MAC-адреса вы можете проанализировать вывод netstat -ie
в Linux или ipconfig /all
в Windows.
Вы можете получить IP-адрес клиента от $_SERVER['REMOTE_ADDR']
MAC-адрес клиента не будет вам доступен, за исключением одного особого обстоятельства: если клиент находится в том же сегменте Ethernet, что и сервер.
Итак, если вы строите какую-то систему на основе локальной сети и ваши клиенты находятся в одном и том же сегменте Ethernet, то вы можете получить MAC-адрес, проанализировав выходные данные arp -n
(linux) или arp -a
(windows).
Изменить : вы спрашиваете в комментариях, как получить вывод внешней команды - один из способов заключается в использовании обратных галочек, например
$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];
}
}
Что ж, вам не повезло, если вы не можете заставить клиента добровольно передать эту информацию и передать ее другими способами.
MAC-адрес клиента (в смысле компьютера, который выдал HTTP-запрос) перезаписывается каждым маршрутизатором между клиентом и сервером.
Клиентский IP удобно указывается в скрипте в $_SERVER['REMOTE_ADDR']
. В некоторых сценариях, особенно если ваш веб-сервер находится за прокси-сервером (т. Е. Прокси-сервер кэширования) $_SERVER['REMOTE ADDR']
, возвращает IP-адрес прокси-сервера , и часто возникает дополнительное значение $_SERVER['HTTP_X_FORWARDED_FOR']
, которое содержит IP-адрес исходного клиента запроса.
Иногда, особенно когда вы имеете дело с анонимным прокси, который вы не контролируете, прокси не возвращает реальный IP-адрес, и все, на что вы можете надеяться, это IP-адрес прокси.
Я не думаю, что вы можете получить MAC-адрес в PHP, но вы можете получить IP из $_SERVER['REMOTE_ADDR']
переменной.
Для Windows Server, я думаю, вы можете использовать это:
<?php
echo exec('getmac');
?>
exec
только `echogetmac
Все, что вам нужно сделать, это положить 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
.
arp
двоичного файла является избыточным, www-data
все еще имеет разрешения на выполнение из other
режима.
Используйте этот класс (https://github.com/BlakeGardner/php-mac-address)
Это класс PHP для манипулирования MAC-адресами поверх операционных систем Unix, Linux и Mac OS X. это было прежде всего написано, чтобы помочь со спуфингом для беспроводных аудитов безопасности.
В 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);
?>
Вы можете использовать следующее решение для решения вашей проблемы:
$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;
Получение MAC-адреса с использованием PHP: (протестировано в Ubuntu 18.04) - обновление 2020
Вот код:
<?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
?>
Вывод:
{
"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"
}
Возможно, получение адреса Mac не лучший способ проверки компьютера клиента через Интернет. Попробуйте вместо этого использовать токен, который сохраняется в браузере клиента с помощью логина администратора.
Поэтому клиент может иметь этот токен только в том случае, если администратор предоставит его ему через браузер. Если токен отсутствует или действителен, значит, клиентский компьютер недействителен.
Вы можете получить MAC- адрес или физический адрес, используя этот код
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
Я использовал explode много раз, потому что shell_exec ("ipconfig / all") возвращает полную информацию о всей сети. поэтому вы должны разделить по одному. когда вы запустите этот код, вы получите
свой MAC-адрес 00 - ## - ## - CV-12 // это поддельный адрес только для показа.
// 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;
Это работает для меня в Windows, как ipconfig /all
и системная команда Windows.
Вы можете сделать это легко, используя 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-адрес и имя хоста.