Como posso obter o MAC e o endereço IP de um cliente conectado em PHP?

136

Preciso saber o MAC e o endereço IP dos clientes conectados, como posso fazer isso em PHP?

Neveen
fonte
Endereço IP de quê? Do cliente que está conectado?
Palantir
1
Endereço do servidor ou de um visitante?
KiNgMaR 14/09/09
13
Para que finalidade você deseja o endereço MAC? Você sabe que pode ser alterado pelo usuário?
Marquês de Lorne
@EJP Tenho um caso de uso para o endereço MAC. Desejo veicular informações diferentes com base no dispositivo que está solicitando a página da web. Existe outra maneira de obter informações exclusivas do dispositivo que está solicitando a página?
Dante

Respostas:

186

IP do servidor

Você pode obter o endereço IP do servidor $_SERVER['SERVER_ADDR'].

Endereço MAC do servidor

Para o endereço MAC, você pode analisar a saída netstat -ieno Linux ou ipconfig /allno Windows.

Endereço IP do cliente

Você pode obter o IP do cliente em $_SERVER['REMOTE_ADDR']

Endereço MAC do cliente

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

Mas e se o cliente não estiver em uma LAN?

Bem, você está sem sorte, a menos que possa fazer com que o cliente ofereça essas informações e transmita por outros meios.

Paul Dixon
fonte
2
Como obter a saída do arp -a usando php ??
Neveen
1
@paulDixon Olá, este é um post antigo, e gostaria de saber se há uma nova maneira de obter o Endereço Mac.
precisa saber é o seguinte
@ jcho360 Ainda não é possível obter o endereço MAC de um cliente. Não espero que isso aconteça, porque o endereço MAC não tem valor de comunicação e, portanto, não será preservado no cabeçalho da solicitação het.
Bearwulf
@ Bearwulf muito obrigado pela resposta, é o que eu pensava, existe alguma maneira de identificar computadores únicos conectados a um site?
jcho360
6
@ jcho360 Pessoalmente, usaria uma combinação de endereço IP + Solicitar informações e fazer um hash, por exemplo, md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Definitivamente não é à prova de balas, mas é um começo. Outra maneira mais fácil e segura é definir um cookie com um hash exclusivo. Ao usar esse cookie sempre que tiver certeza de qual usuário está se conectando ao seu site.
Bearwulf
24

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.

Michał Tatarynowicz
fonte
9

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.

RaYell
fonte
Você pode obter o endereço MAC, eu acho :)
Jitesh Sojitra
endereço MAC estiver visível apenas para redes locais, você pode acessar o endereço MAC de qualquer dispositivo fora da rede local; por exemplo, o endereço MAC será armazenado e visível no roteador wifi local e, fora dele, todos os dispositivos da rede estar usando e será comunicado com o mesmo endereço IP, que roteador converterá novamente em endereço mac e o enviará internamente.
Dheeraj Thedijje 16/10
7

Para o servidor Windows, acho que você pode usar isso:

<?php
echo exec('getmac');
?>
Simos
fonte
2
<? php echo exec ('getmac'); ?> funciona apenas na LAN, mas este mostra todos os endereços mac <php system ('getmac'); ?>
Giorgi Gogitidze
E windows10 também. Além disso, você não deve usar execapenas `eco 'getmac
SaidbakR 18/04/19
6

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

McJ
fonte
6
Isso fornecerá apenas os endereços MAC dos dispositivos na sua rede local.
duskwuff -inactive-
1
Alterar o grupo do arpbinário é redundante, www-dataainda tem permissões de execução do otherumode.
deed02392
1

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); 
?>
Mirtov
fonte
0

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;
AbdulRahman AlShamiri
fonte
0

Podemos obter o endereço MAC no Ubuntu desta maneira em php

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

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"
}
Smack Alpha
fonte
0

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.

Rosue Walford
fonte
-1

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.

Pankaj Kumar
fonte
-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;  

Isso funciona para mim no Windows, assim como ipconfig /allo comando do sistema Windows.

Ashwin
fonte
5
Se esta resposta lhe ensinar alguma coisa, esperamos que você não copie / cole o código que você não entende. Não faz o que o OP pediu.
tripleee
-2

no linux usando iptables, você pode registrar em um arquivo cada solicitação ao servidor web com endereço mac e ip. de pesquisa php último item com endereço IP e obter endereço MAC.

Conforme declarado, lembre-se de que o endereço mac é do último roteador no rastreamento.

TexWiller
fonte
-4

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.

Bernat Pedrol Vozmediano
fonte