Мне нужно знать 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['HTTP_X_FORWARDED_FOR']
прокси), $_SERVER['REMOTE ADDR']
вернет IP-адрес прокси-сервера , и будет добавлено дополнительное значение, часто $_SERVER['HTTP_X_FORWARDED_FOR']
, который содержит IP исходного клиента запроса.
Иногда, особенно когда вы имеете дело с анонимным прокси, который вы не контролируете, прокси не вернет реальный IP-адрес, и все, на что вы можете надеяться, это IP-адрес прокси-сервера.
Я не думаю, что вы можете получить MAC-адрес в PHP, но вы можете получить IP из переменной $_SERVER['REMOTE_ADDR']
.
Все, что вам нужно сделать, – это включить 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
.
Для сервера Windows я думаю, что вы можете использовать это:
<?php echo exec('getmac'); ?>
В окнах, если пользователь использует ваш скрипт локально, это будет очень просто:
<?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); ?>
Используйте этот класс (https://github.com/BlakeGardner/php-mac-address)
Это класс PHP для обработки MAC-адресов поверх операционных систем Unix, Linux и Mac OS X. в основном это было написано, чтобы помочь с подделкой для проверок беспроводной безопасности.
под linux с помощью iptables вы можете записывать в файл каждый запрос на веб-сервер с адресом mac и ip. от php искать последний элемент с IP-адресом и получить MAC-адрес.
Как указано, помните, что адрес mac находится от последнего маршрутизатора на трассе.
Вы можете сделать это легко, используя openWRT. Если вы используете портативный портал, вы можете смешивать php и openWRT и устанавливать связь между IP и маком.
Вы можете написать простой PHP-код, используя:
$localIP = getHostByName(getHostName());
Позже, используя openWRT, вы можете перейти в /tmp/dhcp.leases
, вы получите что-то с формой:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
Там у вас есть mac, IP-адрес и имя хоста.
//get user real ip function kh_getUserIP(){ $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = $_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)){ $ip = $client; }elseif(filter_var($forward, FILTER_VALIDATE_IP)){ $ip = $forward; }else{ $ip = $remote; } return $ip; }
// 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.