Як я можу отримати MAC та IP-адресу підключеного клієнта в PHP?


136

Мені потрібно знати MAC та IP-адресу підключених клієнтів, як це зробити в PHP?


IP-адреса чого? З клієнтом, який підключений?
Палантір

1
Адреса сервера чи відвідувача?
KiNgMaR

13
З якою метою ви хочете адресу MAC? Чи знаєте ви, що користувач може це змінити?
Маркіз Лорнський

@EJP У мене є випадок використання MAC-адреси. Я хочу подавати різну інформацію на основі пристрою, який запитує веб-сторінку. Чи є інший спосіб отримати унікальну інформацію про пристрій, який запитує сторінку?
Данте

Відповіді:


186

IP сервера

Ви можете отримати IP-адресу сервера від $_SERVER['SERVER_ADDR'].

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

Щодо MAC-адреси, ви можете проаналізувати вихід netstat -ieу Linux або ipconfig /allWindows.

IP-адреса клієнта

Ви можете отримати IP клієнта від $_SERVER['REMOTE_ADDR']

MAC-адреса клієнта

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

Але що робити, якщо клієнт не в мережі?

Ну, вам не пощастило, якщо ви не зможете клієнта добровільно подати цю інформацію та передати іншим способом.


2
Як отримати вихід arp -a, використовуючи php ??
Neveen

1
@paulDixon привіт це стара публікація, і мені цікаво, чи є новий спосіб отримати адресу Mac?
jcho360

@ jcho360 Ще не вдається отримати MAC-адресу клієнта. Я не сподіваюся, що це все одно відбудеться, тому що MAC-адреса не має комунікаційного значення і тому не збережеться в заголовку het-запиту.
Bearwulf

@Bearwulf дуже дякую за відповідь, ось що я подумав, чи є можливість виявити унікальні комп'ютери, підключені до сайту?
jcho360

6
@ jcho360 Особисто я використовував би комбінацію IP-адреси + Запити інформацію та зробити хеш-код, наприклад md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Це, безумовно, не куленепробивна, але її початок. Ще один більш простий і безпечний спосіб - це встановлення файлу cookie з унікальним хешем. Використовуючи цей файл cookie кожного разу, ви впевнені, хто з користувачів підключається до вашого веб-сайту.
Bearwulf

24

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

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

Іноді, особливо коли ви маєте справу з анонімним проксі, яким ви не керуєте, проксі не поверне справжню IP-адресу, і все, на що можна сподіватися, - це IP-адреса проксі.


9

Я не думаю, що ви можете отримати MAC-адресу в PHP, але ви можете отримати IP від $_SERVER['REMOTE_ADDR']змінної.


Ви можете отримати mac-адресу, я думаю :)
Jitesh Sojitra

mac-адреса видно лише в локальних мережах, ви можете отримати доступ до mac-адреси будь-якого пристрою із своєї локальної мережі, наприклад, ваша mac-адреса буде збережена та помітна у вашому локальному маршрутизаторі wifi, а поза нею всі пристрої у вашій мережі будуть буде використовуватися і буде передано ту саму IP-адресу, яку маршрутизатор переведе назад на mac-адресу та надішле її всередину.
Dheeraj Thedijje

7

Для сервера Windows я думаю, що ви можете використовувати це:

<?php
echo exec('getmac');
?>

2
<? php echo exec ('getmac'); ?> він працює лише в локальній мережі, але цей показує всю mac-адресу <php system ('getmac'); ?>
Giorgi Gogitidze

І windows10 теж. Також вам не доведеться використовувати execпросто `echogetmac
SaidbakR

6

Все, що вам потрібно зробити, - це ввести арпу в іншу групу.

За замовчуванням:

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


6
Це дасть вам лише MAC-адреси пристроїв у вашій локальній мережі.
duskwuff -inactive-

1
Зміна групи arpдвійкових є зайвою, www-dataдосі має дозволи на виконання otherumode.
deed02392


1

У 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

Ви можете використовувати таке рішення для вирішення своєї проблеми:

$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

Ми можемо отримати MAC-адресу в Ubuntu цими способами в php

$ipconfig =   shell_exec ("ifconfig -a | grep -Po 'HWaddr \K.*$'");  
    // display mac address   
 echo $ipconfig;

0

Отримання 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"
}

0

Можливо, отримання адреси Mac - це не найкращий підхід для перевірки роботи клієнта через Інтернет. Подумайте про використання маркера, який зберігається у браузері клієнта за допомогою логіна адміністратора.

Тому клієнт може мати цей маркер лише в тому випадку, якщо адміністратор надає їм його через браузер. Якщо маркер відсутній або дійсний, машина клієнта недійсна.


-1

Ви можете отримати 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 // це фальшива адреса лише для показу.


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

Це працює для мене в Windows, як ipconfig /allі системна команда Windows.


5
Якщо ця відповідь навчить вас чомусь, сподіваємось, не буде копіювати / вставляти код, який ви не розумієте. Це не робить того, що просив ОП.
трійчатка

-2

під linux за допомогою iptables ви можете увійти у файл, кожен запит на веб-сервер з mac адресою та ip. з php пошуку останнього елемента з ip адресою та отримання mac адреси.

Як зазначалося, пам’ятайте, що mac-адреса є від останнього маршрутизатора на трасі.


-4

Це можна легко зробити за допомогою 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-адреса та ім'я хоста.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.