Come indentificare il mac address di un utente in PHP
In questo articolo vediamo se, e come, sia possibile ottenere il MAC ADDRESS di un utente che sta navigando il nostro sito, utilizzando PHP, in un ambiente Linux.
Cos'è un MAC ADDRESS
E' un identificatore univoco di ogni scheda di rete, che sia ethernet o wireless. E' un codice a 48 bit (6 byte) assegnato in modo univoco dal produttore ad ogni scheda di rete ethernet.
Esistono quindi 2^48 possibili combinazioni, cioè 281.400 miliardi di possibili valori.
Ecco un esempio di indirizzo MAC: c0:bf:c0:89:6a:1e
A noi interessa recuperare il MAC ADDRESS dell'utente che sta visitando il nostro sito, non quindi il MAC ADDRESS del nostro pc.
Possiamo ottenere il MAC ADDRESS di un utente con PHP?
La prima risposta che posso darti è: ni.
PHP non dispone infatti di variabili che consentano di leggere il mac address di un utente, o funzioni native per ottenerlo.
Tuttavia, possiamo superare questo limite utlizzando exec() o shell_exec(), funzioni PHP che consentono di eseguire un comando Linux da PHP.
Devo però darti un'altra pessima notizia. Putroppo non possiamo ottenere l'indirizzo mac di un utente che sta visitando il nostro sito, a meno che non sia in una LAN. Non volevo dirtelo prima, altrimenti non avresti letto questo articolo :-)
Se l'utente è nella stessa LAN possiamo usare il comando ARP (Address Resolution Protocol) che permette di risalire all'indirizzo fisico di una scheda di rete (il MAC Address) corrispondente ad un dato indirizzo IP.
Quindi per prima cosa occorre recuperare l'IP dell'utente. In questo esempio, per comodità, utilizziamo $_SERVER['REMOTE_ADDR'], ma, come sappiamo, non è il modo migliore per ottenerlo. Ho dedicato un articolo approfondito su come ottenere l'IP di un utente in PHP.
Recuperato l'ip dell'utente, tramite shell_exec chiamiamo il comando arp, ed otteniamo l'indirizzo mac
Prima di creare un script, prova a lancare da terminale arp -a così da capire cosa rispode il comando arp. Ecco un esempio.
# arp -a
host71-125-265-82.serverdedicati.mioprovider.com (83.245.136.7) at 00:39:56:a7:6e:f5 [ether] on eth32
host254-125-265-82.serverdedicati.mioprovider.com (83.245.136.254) at 00:39:56:a7:0b:8f [ether] on eth32
host10-125-265-82.serverdedicati.mioprovider.com (83.245.136.10) at 00:39:56:a7:03:3d [ether] on eth32
host4-125-265-82.serverdedicati.mioprovider.com (83.245.136.4) at 00:39:56:a7:f8:78 [ether] on eth32
? (192.168.1.27) at 00:39:56:a7:e1:de [ether] on ens33
host1-125-265-82.serverdedicati.mioprovider.com (83.245.136.1) at 00:00:5e:00:01:04 [ether] on eth32
host23-125-265-82.serverdedicati.mioprovider.com (83.245.136.23) at 00:39:56:a7:c5:4a [ether] on eth32
host2-125-265-82.serverdedicati.mioprovider.com (83.245.136.2) at d0:ef:c0:89:64:1e [ether] on eth32
? (192.168.1.28) at 00:39:56:a7:37:17 [ether] on ens33
host3-125-265-82.serverdedicati.mioprovider.com (83.245.136.3) at d0:ef:c0:89:6a:1e
Adesso vediamo come utilizzarlo in uno script PHP e come recuperare il mac address da questa lista
<?php
$ipaddress = $_SERVER['REMOTE_ADDR'];
$mac = shell_exec("/usr/sbin/arp -a $ipaddress | awk '{print $4}'");
echo "ip: ".$ipaddress.", mac_addr: $mac";
?>
Nello script abbiamo utilizzato awk per manipolare il dato ottenuto, e quindi estrarre il solo mac address.
Inoltre abbiamo utilizzato /usr/sbin/arp, cioè il path completo del programma, e non solo semplicemente arp, perchè chiamato da PHP potrebbe rendere un "command not found".
Anche se probabilmente avresti voluto conoscere il mac address di un utente remoto, ed hai capito di non poterlo ottenere, spero che questo articolo ti sia stato comunque di aiuto.
Stay tuned!