Necesito saber el MAC y la dirección IP de los clientes conectados, ¿cómo puedo hacer esto en PHP?
Necesito saber el MAC y la dirección IP de los clientes conectados, ¿cómo puedo hacer esto en PHP?
Respuestas:
Puede obtener la dirección IP del servidor $_SERVER['SERVER_ADDR']
.
Para la dirección MAC, puede analizar la salida de netstat -ie
en Linux o ipconfig /all
en Windows.
Puede obtener la IP del cliente de $_SERVER['REMOTE_ADDR']
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];
}
}
Bueno, no tienes suerte a menos que puedas hacer que el cliente ofrezca voluntariamente esa información y la transmita por otros medios.
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.
No creo que pueda obtener la dirección MAC en PHP, pero puede obtener IP de la $_SERVER['REMOTE_ADDR']
variable.
Para el servidor de Windows, creo que puedes usar esto:
<?php
echo exec('getmac');
?>
exec
solo `echogetmac
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 -an
comando Linux .
arp
binario es redundante, www-data
todavía tiene permisos de ejecución desde el modo other
u.
Utilice esta clase (https://github.com/BlakeGardner/php-mac-address)
Esta es una clase PHP para la manipulación de direcciones MAC además de los sistemas operativos Unix, Linux y Mac OS X. fue escrito principalmente para ayudar con la falsificación de auditorías de seguridad inalámbricas.
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);
?>
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;
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"
}
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.
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.
// 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 /all
es el comando del sistema de Windows.
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.
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.leases
acceder, 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.