Come posso ottenere il MAC e l'indirizzo IP di un client connesso in PHP?


136

Devo conoscere il MAC e l'indirizzo IP dei client di connessione, come posso farlo in PHP?


Indirizzo IP di cosa? Del client connesso?
Palantir,

1
Indirizzo del server o di un visitatore?
KiNgMaR,

13
Per quale scopo vuoi l'indirizzo MAC? Sei consapevole che può essere modificato dall'utente?
Marchese di Lorne,

@EJP Ho un caso d'uso per l'indirizzo MAC. Voglio fornire informazioni diverse in base al dispositivo che richiede la pagina Web. C'è un altro modo per ottenere informazioni uniche sul dispositivo che richiede la pagina?
Dante,

Risposte:


186

IP del server

È possibile ottenere l'indirizzo IP del server da $_SERVER['SERVER_ADDR'].

Indirizzo MAC del server

Per l'indirizzo MAC, è possibile analizzare l'output di netstat -iein Linux o ipconfig /allin Windows.

Indirizzo IP del client

È possibile ottenere l'IP client da $_SERVER['REMOTE_ADDR']

Indirizzo MAC del client

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

E se il client non fosse su una LAN?

Bene, sei sfortunato a meno che tu non possa avere il cliente volontario di tali informazioni e trasmettere tramite altri mezzi.


2
Come ottenere l'output di arp -a usando php ??
Neveen,

1
@paulDixon ciao, questo è un vecchio post, e mi chiedo: esiste un nuovo modo per ottenere l'indirizzo Mac?
jcho360,

@ jcho360 Non è ancora possibile ottenere l'indirizzo MAC di un client. Non mi aspetto di vederlo accadere comunque perché l'indirizzo MAC non ha alcun valore di comunicazione e quindi non verrà conservato nell'intestazione della richiesta.
Bearwulf,

@Bearwulf grazie mille per la risposta, ecco cosa ho pensato, c'è un modo per identificare i computer unici collegati a un sito?
jcho360,

6
@ jcho360 Personalmente userei una combinazione di indirizzo IP + Richiedi informazioni e ne faccio un hash, ad esempio md5 ($ _ SERVER ['REMOTE_ADDR']. $ _SERVER ['HTTP_USER_AGENT']) ;. Sicuramente non è a prova di proiettile ma è un inizio. Un altro modo più semplice e sicuro è impostare un cookie con un hash unico. Quando usi quel cookie ogni volta che sei sicuro di quale utente si sta collegando al tuo sito web.
Bearwulf,

24

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.


9

Non penso che tu possa ottenere l'indirizzo MAC in PHP, ma puoi ottenere l'IP dalla $_SERVER['REMOTE_ADDR']variabile.


Puoi ottenere l'indirizzo mac, credo :)
Jitesh Sojitra,

l'indirizzo mac è visibile solo alle reti locali, puoi accedere all'indirizzo mac di qualsiasi dispositivo fuori dalla sua rete locale, ad esempio il tuo indirizzo mac sarà memorizzato e visibile nel tuo router wifi locale, e al di fuori di esso, tutti i dispositivi nella tua rete saranno verrà utilizzato e verrà comunicato con lo stesso indirizzo IP, che il router tradurrà di nuovo all'indirizzo mac e lo invierà internamente.
Dheeraj Thedijje,

7

Per Windows Server penso che tu possa usare questo:

<?php
echo exec('getmac');
?>

2
<? php echo exec ('getmac'); ?> funziona solo su LAN, ma questo mostra tutto l'indirizzo mac <sistema php ('getmac'); ?>
Giorgi Gogitidze l'

E anche windows10. Inoltre, non devi usare execsolo `echogetmac
SaidbakR

6

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


6
Questo ti darà solo gli indirizzi MAC dei dispositivi sulla tua rete locale.
duskwuff -inattivo-

1
La modifica del gruppo del file arpbinario è ridondante, www-dataha ancora autorizzazioni di esecuzione da otherumode.
deed02392


1

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); 
?>

0

È 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;

0

Possiamo ottenere l'indirizzo MAC in Ubuntu in questo modo in php

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

0

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"
}

0

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.


-1

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.


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

Questo funziona per me su Windows, così come il ipconfig /allcomando di sistema di Windows.


5
Se questa risposta ti insegna qualcosa, si spera non sia di copiare / incollare il codice che non capisci. Non fa ciò che l'OP ha chiesto.
Tripleee,

-2

sotto linux usando iptables puoi accedere ad un file ogni richiesta al web server con indirizzo mac e ip. dalla ricerca php ultimo elemento con indirizzo IP e ottenere l'indirizzo mac.

Come detto, ricorda che l'indirizzo mac proviene dall'ultimo router sulla traccia.


-4

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.