Devo conoscere il MAC e l'indirizzo IP dei client di connessione, come posso farlo in PHP?
Devo conoscere il MAC e l'indirizzo IP dei client di connessione, come posso farlo in PHP?
Risposte:
È possibile ottenere l'indirizzo IP del server da $_SERVER['SERVER_ADDR']
.
Per l'indirizzo MAC, è possibile analizzare l'output di netstat -ie
in Linux o ipconfig /all
in Windows.
È possibile ottenere l'IP client da $_SERVER['REMOTE_ADDR']
L'indirizzo MAC del client non sarà disponibile tranne in una circostanza speciale: se il client si trova sullo stesso segmento Ethernet del server.
Quindi, se stai costruendo un qualche tipo di sistema basato su LAN e i tuoi client si trovano sullo stesso segmento Ethernet, allora potresti ottenere l'indirizzo MAC analizzando l'output di arp -n
(linux) o arp -a
(windows).
Modifica : chiedi nei commenti come ottenere l'output di un comando esterno: un modo è usare i backtick, ad es
$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];
}
}
Bene, sei sfortunato a meno che tu non possa avere il cliente volontario di tali informazioni e trasmettere tramite altri mezzi.
L'indirizzo MAC di un client (nel senso del computer che ha emesso la richiesta HTTP) viene sovrascritto da ogni router tra il client e il server.
L'IP client viene fornito comodamente allo script in $_SERVER['REMOTE_ADDR']
. In alcuni scenari, in particolare se il server Web è protetto da un proxy (ovvero un proxy di memorizzazione nella cache) $_SERVER['REMOTE ADDR']
restituirà l'IP del proxy e spesso ci sarà un valore aggiuntivo $_SERVER['HTTP_X_FORWARDED_FOR']
che contiene l'IP del client di richiesta originale.
A volte, in particolare quando si ha a che fare con un proxy anonimo che non si controlla, il proxy non restituisce il vero indirizzo IP e tutto ciò che si può sperare è l'indirizzo IP del proxy.
Non penso che tu possa ottenere l'indirizzo MAC in PHP, ma puoi ottenere l'IP dalla $_SERVER['REMOTE_ADDR']
variabile.
Per Windows Server penso che tu possa usare questo:
<?php
echo exec('getmac');
?>
exec
solo `echogetmac
Tutto quello che devi fare è mettere l'arp in un gruppo diverso.
Predefinito:
-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
otterrete:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
E poiché apache è un demone in esecuzione sotto l'utente www-data, ora è in grado di eseguire questo comando.
Quindi se ora usi uno script PHP, ad esempio:
<?php
$mac = system('arp -an');
echo $mac;
?>
otterrai l'output del arp -an
comando linux .
arp
binario è ridondante, www-data
ha ancora autorizzazioni di esecuzione da other
umode.
Usa questa classe (https://github.com/BlakeGardner/php-mac-address)
Questa è una classe PHP per la manipolazione dell'indirizzo MAC su sistemi operativi Unix, Linux e Mac OS X. è stato scritto principalmente per aiutare con lo spoofing per i controlli di sicurezza wireless.
In Windows, se l'utente utilizza lo script localmente, sarà molto semplice:
<?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);
?>
È possibile utilizzare la seguente soluzione per risolvere il 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;
Ottenere l'indirizzo MAC usando PHP: (Testato in Ubuntu 18.04) - Aggiornamento 2020
Ecco il codice:
<?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
?>
Produzione:
{
"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"
}
Forse ottenere l'indirizzo Mac non è l'approccio migliore per verificare la macchina di un client su Internet. Prendi invece in considerazione l'uso di un token che viene archiviato nel browser del client dall'accesso di un amministratore.
Pertanto, il client può avere questo token solo se l'amministratore lo concede tramite il proprio browser. Se il token non è presente o valido, la macchina del client non è valida.
Puoi ottenere l' indirizzo MAC o l'indirizzo fisico usando questo codice
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
Ho usato esplodere molte volte perché shell_exec ("ipconfig / all") restituisce i dettagli completi di tutta la rete. quindi devi dividere uno per uno. quando esegui questo codice otterrai il
tuo indirizzo MAC 00 - ## - ## - CV-12 // questo è un indirizzo falso solo per lo spettacolo.
// 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;
Questo funziona per me su Windows, così come il ipconfig /all
comando di sistema di Windows.
Puoi farlo facilmente usando openWRT. Se usi un portale captive puoi mescolare php e openWRT e stabilire una relazione tra IP e mac.
Puoi scrivere un semplice codice PHP usando:
$localIP = getHostByName(getHostName());
Successivamente, usando openWRT puoi andare a /tmp/dhcp.leases
, otterrai qualcosa con il modulo:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
Lì, hai il mac, l'indirizzo IP e il nome host.