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

136

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

Neveen
источник
IP-адрес чего? Из клиента, который связан?
Палантир
1
Адрес сервера или посетителя?
KiNgMaR
13
С какой целью вы хотите MAC-адрес? Знаете ли вы, что это может быть изменено пользователем?
Маркиз Лорн
@EJP У меня есть сценарий использования MAC-адреса. Я хочу предоставлять различную информацию в зависимости от устройства, запрашивающего веб-страницу. Есть ли другой способ получить уникальную информацию об устройстве, запрашивающем страницу?
Данте

Ответы:

186

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(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 ??
Невин
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']переменной.

RaYell
источник
Вы можете получить MAC-адрес, я думаю :)
Jitesh Sojitra
Mac-адрес виден только локальным сетям, вы можете получить доступ к MAC-адресу любого устройства из своей локальной сети, например, ваш MAC-адрес будет сохранен и виден на вашем локальном маршрутизаторе Wi-Fi, а вне него все устройства в вашей сети будут использовать и будет сообщаться с тем же IP-адресом, который маршрутизатор будет преобразовывать обратно в Mac-адрес и отправит его внутренне.
Dheeraj Thedijje
7

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

<?php
echo exec('getmac');
?>
Simos
источник
2
<? php echo exec ('getmac'); ?> он работает только в локальной сети, но этот показывает все mac-адреса <php system ('getmac'); ?>
Георгий Гогитидзе
И windows10 тоже. Кроме того, вы не должны использовать execтолько `echogetmac
SaidbakR
6

Все, что вам нужно сделать, это положить 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.

MCJ
источник
6
Это даст вам только MAC-адреса устройств в вашей локальной сети.
сумерки -неактивно-
1
Изменение группы arpдвоичного файла является избыточным, www-dataвсе еще имеет разрешения на выполнение из otherрежима.
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.

Ashwin
источник
5
Если этот ответ вас чему-то научит, мы надеемся, что не будем копировать / вставлять код, который вы не понимаете. Он не делает то, что спросил ОП.
tripleee
-2

В Linux с помощью iptables вы можете регистрировать в файле каждый запрос к веб-серверу с MAC-адресом и IP-адресом. из php искать последний элемент с IP-адресом и получить MAC-адрес.

Как указано, помните, что MAC-адрес от последнего маршрутизатора на трассе.

TexWiller
источник
-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-адрес и имя хоста.

Бернат Педрол Возмедиано
источник