Мені потрібно знати 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 я думаю, що ви можете використовувати це:
<?php
echo exec('getmac');
?>
exec
просто `echogetmac
Все, що вам потрібно зробити, - це ввести арпу в іншу групу.
За замовчуванням:
-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-data, тепер він може виконувати цю команду.
Отже, якщо ви зараз використовуєте скрипт PHP, наприклад:
<?php
$mac = system('arp -an');
echo $mac;
?>
ви отримаєте вихід команди Linux arp -an
.
arp
двійкових є зайвою, www-data
досі має дозволи на виконання other
umode.
Використовуйте цей клас (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-адреса та ім'я хоста.