¿Cómo puedo obtener el MAC y la dirección IP de un cliente conectado en PHP?

136

Necesito saber el MAC y la dirección IP de los clientes conectados, ¿cómo puedo hacer esto en PHP?

Neveen
fuente
¿Dirección IP de qué? ¿Del cliente que está conectado?
Palantir el
1
¿Dirección del servidor o de un visitante?
KiNgMaR
13
¿Para qué quieres la dirección MAC? ¿Sabías que el usuario puede cambiarlo?
Marqués de Lorne
@EJP Tengo un caso de uso para la dirección MAC. Quiero servir información diferente según el dispositivo que solicita la página web. ¿Hay otra forma de obtener información única del dispositivo que solicita la página?
Dante

Respuestas:

186

Servidor IP

Puede obtener la dirección IP del servidor $_SERVER['SERVER_ADDR'].

Dirección MAC del servidor

Para la dirección MAC, puede analizar la salida de netstat -ieen Linux o ipconfig /allen Windows.

Dirección IP del cliente

Puede obtener la IP del cliente de $_SERVER['REMOTE_ADDR']

Dirección MAC del cliente

La dirección MAC del cliente no estará disponible para usted, excepto en una circunstancia especial: si el cliente está en el mismo segmento de Ethernet que el servidor.

Entonces, si está creando algún tipo de sistema basado en LAN y sus clientes están en el mismo segmento de Ethernet, entonces podría obtener la dirección MAC analizando la salida de arp -n(linux) o arp -a(windows).

Editar : pregunta en los comentarios cómo obtener la salida de un comando externo; una forma es usar backticks, por ejemplo

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

Pero, ¿qué pasa si el cliente no está en una LAN?

Bueno, no tienes suerte a menos que puedas hacer que el cliente ofrezca voluntariamente esa información y la transmita por otros medios.

Paul Dixon
fuente
2
¿Cómo obtener la salida de arp -a usando php ??
Neveen
1
@paulDixon hola, esta es una publicación antigua, y me pregunto si hay una nueva forma de obtener la dirección de Mac.
jcho360
@ jcho360 Todavía no es posible obtener la dirección MAC de un cliente. No espero ver que suceda de todos modos porque la dirección MAC no tiene valor de comunicación y, por lo tanto, no se conservará en su encabezado de solicitud.
Bearwulf el
@Bearwulf muchas gracias por responder, eso es lo que pensé, ¿hay alguna manera de identificar computadoras únicas conectadas a un sitio?
jcho360
66
@ jcho360 Personalmente, usaría una combinación de dirección IP + Solicitar información y hacer un resumen de la misma, por ejemplo md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Definitivamente no es a prueba de balas, pero es un comienzo. Otra forma más fácil y segura es configurar una cookie con un hash único. Cuando use esa cookie cada vez que esté seguro de qué usuario se está conectando a su sitio web.
Bearwulf
24

La dirección MAC de un cliente (en el sentido de la computadora que emitió la solicitud HTTP) es sobrescrita por cada enrutador entre el cliente y el servidor.

La IP del cliente se proporciona convenientemente al script en $_SERVER['REMOTE_ADDR']. En algunos escenarios, particularmente si su servidor web está detrás de un proxy (es decir, un proxy de almacenamiento en caché) $_SERVER['REMOTE ADDR']devolverá la IP del proxy y, a menudo $_SERVER['HTTP_X_FORWARDED_FOR'], habrá un valor adicional que contiene la IP del cliente de solicitud original.

A veces, particularmente cuando se trata de un proxy anónimo que no controla, el proxy no devolverá la dirección IP real, y todo lo que puede esperar es la dirección IP del proxy.

Michał Tatarynowicz
fuente
9

No creo que pueda obtener la dirección MAC en PHP, pero puede obtener IP de la $_SERVER['REMOTE_ADDR']variable.

RaYell
fuente
Puede obtener la dirección mac, creo :)
Jitesh Sojitra
la dirección mac es visible solo para redes locales, puede acceder a la dirección mac de cualquier dispositivo fuera de su red local, por ejemplo, su dirección mac se almacenará y será visible en su enrutador wifi local, y fuera de ella, todos los dispositivos en su red usará y se comunicará con la misma dirección IP, que enrutador se traducirá de nuevo a la dirección MAC y lo enviará internamente.
Dheeraj Thedijje
7

Para el servidor de Windows, creo que puedes usar esto:

<?php
echo exec('getmac');
?>
Simos
fuente
2
<? php echo exec ('getmac'); ?> solo funciona en LAN, pero esta muestra todas las direcciones mac <sistema php ('getmac'); ?>
Giorgi Gogitidze
Y windows10 también. Además, no debe usar execsolo `echogetmac
SaidbakR
6

Todo lo que necesita hacer es colocar arp en un grupo diferente.

Defecto:

-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*

Con comando:

sudo chown root:www-data /usr/sbin/arp

conseguirás:

-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*

Y como apache es un demonio que se ejecuta bajo el usuario www-data, ahora puede ejecutar este comando.

Entonces, si ahora usa un script PHP, por ejemplo:

<?php
$mac = system('arp -an');
echo $mac;
?>

Obtendrá la salida del arp -ancomando Linux .

McJ
fuente
66
Eso solo le dará las direcciones MAC de los dispositivos en su red local.
duskwuff -inactive-
1
Cambiar el grupo del arpbinario es redundante, www-datatodavía tiene permisos de ejecución desde el modo otheru.
deed02392
1

En Windows, si el usuario usa su script localmente, será muy simple:

<?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
fuente
0

Puede usar la siguiente solución para resolver su 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
fuente
0

Podemos obtener la dirección MAC en Ubuntu de esta manera en php

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

Obteniendo la dirección MAC usando PHP: (Probado en Ubuntu 18.04) - Actualización 2020

Aquí está el 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
?>

Salida:

{
    "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
fuente
0

Quizás obtener la dirección Mac no sea el mejor enfoque para verificar la máquina de un cliente a través de Internet. Considere usar un token en su lugar que se almacena en el navegador del cliente mediante el inicio de sesión de un administrador.

Por lo tanto, el cliente solo puede tener este token si el administrador se lo otorga a través de su navegador. Si el token no está presente o no es válido, la máquina del cliente no es válida.

Rosue Walford
fuente
-1

Puede obtener la dirección MAC o la dirección física con este código

$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));  
$d1 = explode(':',$d[1]);  
$d2 = explode(' ',$d1[1]);  
return $d2[1];

Solía ​​explotar muchas veces porque shell_exec ("ipconfig / all") devuelve detalles completos de toda la red. así que tienes que dividir uno por uno. cuando ejecute este código, obtendrá
su dirección MAC 00 - ## - ## - CV-12 // esta es una dirección falsa solo para mostrar.

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

Esto funciona para mí en Windows, como ipconfig /alles el comando del sistema de Windows.

Ashwin
fuente
55
Si esta respuesta le enseña algo, es de esperar que no copie / pegue el código que no entiende. No hace lo que le pidió el OP.
tripleee
-2

bajo linux usando iptables puede iniciar sesión en un archivo cada solicitud al servidor web con dirección mac e ip. desde el último elemento de búsqueda de php con dirección IP y obtener la dirección mac.

Como se indicó, recuerde que la dirección mac es del último enrutador en la traza.

TexWiller
fuente
-4

Puede hacerlo fácilmente usando openWRT. Si usa un portal cautivo, puede mezclar php y openWRT y establecer una relación entre la IP y la mac.

Puede escribir un código PHP simple usando:

 $localIP = getHostByName(getHostName()); 

Más tarde, usando openWRT al que puede /tmp/dhcp.leasesacceder, obtendrá algo con el formulario:

 e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX 

Ahí tienes el mac, la dirección IP y el nombre de host.

Bernat Pedrol Vozmediano
fuente