Preciso saber o MAC e o endereço IP dos clientes conectados, como posso fazer isso em PHP?
Preciso saber o MAC e o endereço IP dos clientes conectados, como posso fazer isso em PHP?
Respostas:
Você pode obter o endereço IP do servidor $_SERVER['SERVER_ADDR']
.
Para o endereço MAC, você pode analisar a saída netstat -ie
no Linux ou ipconfig /all
no Windows.
Você pode obter o IP do cliente em $_SERVER['REMOTE_ADDR']
O endereço MAC do cliente não estará disponível para você, exceto em uma circunstância especial: se o cliente estiver no mesmo segmento ethernet que o servidor.
Portanto, se você estiver construindo algum tipo de sistema baseado em LAN e seus clientes estiverem no mesmo segmento ethernet, poderá obter o endereço MAC analisando a saída de arp -n
(linux) ou arp -a
(windows).
Edit : você pergunta nos comentários como obter a saída de um comando externo - uma maneira é usar backticks, por exemplo
$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];
}
}
Bem, você está sem sorte, a menos que possa fazer com que o cliente ofereça essas informações e transmita por outros meios.
O endereço MAC de um cliente (no sentido do computador que emitiu a solicitação HTTP) é substituído por todos os roteadores entre o cliente e o servidor.
O IP do cliente é convenientemente fornecido ao script em $_SERVER['REMOTE_ADDR']
. Em alguns cenários, principalmente se o servidor da web estiver protegido por um proxy (ou seja, um proxy de cache) $_SERVER['REMOTE ADDR']
retornará o IP do proxy e haverá um valor extra, geralmente $_SERVER['HTTP_X_FORWARDED_FOR']
, que contém o IP do cliente de solicitação original.
Às vezes, especialmente quando você está lidando com um proxy anônimo que não controla, o proxy não retornará o endereço IP real e tudo o que você pode esperar é o endereço IP do proxy.
Eu não acho que você pode obter o endereço MAC no PHP, mas você pode obter o IP da $_SERVER['REMOTE_ADDR']
variável.
Para o servidor Windows, acho que você pode usar isso:
<?php
echo exec('getmac');
?>
exec
apenas `eco 'getmac
Tudo que você precisa fazer é colocar o arp em um grupo diferente.
Padrão:
-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*
Com o comando:
sudo chown root:www-data /usr/sbin/arp
você vai ter:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
E como o apache é um daemon em execução sob o usuário www-data, agora é capaz de executar este comando.
Portanto, se você agora usa um script PHP, por exemplo:
<?php
$mac = system('arp -an');
echo $mac;
?>
você receberá a saída do arp -an
comando linux .
arp
binário é redundante, www-data
ainda tem permissões de execução do other
umode.
Use esta classe (https://github.com/BlakeGardner/php-mac-address)
Esta é uma classe PHP para manipulação de endereços MAC sobre os sistemas operacionais Unix, Linux e Mac OS X. foi escrito principalmente para ajudar na falsificação de auditorias de segurança sem fio.
No Windows, se o usuário estiver usando seu script localmente, será muito simples:
<?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);
?>
Você pode usar a seguinte solução para resolver seu problema:
$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;
Obtendo o endereço MAC usando o PHP: (Testado no Ubuntu 18.04) - Atualização 2020
Aqui está o código:
<?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
?>
Resultado:
{
"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"
}
Talvez a obtenção do endereço Mac não seja a melhor abordagem para verificar a máquina de um cliente pela Internet. Considere usar um token que é armazenado no navegador do cliente pelo login de um administrador.
Portanto, o cliente só pode ter esse token se o administrador o conceder por meio do navegador. Se o token não estiver presente ou válido, a máquina do cliente é inválida.
Você pode obter MAC endereço ou o endereço físico usando este código
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
Eu costumava explodir muitas vezes porque shell_exec ("ipconfig / all") retorna detalhes completos de toda a rede. então você tem que dividir um por um. Quando você executa esse código, você obtém
seu endereço MAC 00 - ## - ## - CV-12 // este é um endereço falso apenas para exibição.
// 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;
Isso funciona para mim no Windows, assim como ipconfig /all
o comando do sistema Windows.
Você pode fazer isso facilmente usando o openWRT. Se você usa um portal cativo, pode misturar php e openWRT e estabelecer uma relação entre o IP e o mac.
Você pode escrever um código PHP simples usando:
$localIP = getHostByName(getHostName());
Mais tarde, usando o openWRT para o qual você pode acessar /tmp/dhcp.leases
, você obterá algo com o formulário:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
Lá, você tem o mac, o endereço IP e o nome do host.