How to get MAC Address using php

Post Reply
User avatar
Neo
Site Admin
Site Admin
Posts: 2642
Joined: Wed Jul 15, 2009 2:07 am
Location: Colombo

How to get MAC Address using php

Post by Neo » Sun Feb 07, 2010 3:42 pm

Note that the obtained mac address will be correct only if the client is connected DIRECTLY to the php server, if there are routers or gateways that NAT the traffic, the returned mac address will be that of the gateway, not the client beside it.

Code: Select all

function returnMacAddress() {
      /* This code is under the GNU Public Licence
          Written by michael_stankiewicz {don't spam} at yahoo {no spam} dot com
         Tested only on linux, please report bugs */

      // WARNING: the commands 'which' and 'arp' should be executable by the Apache us

      // Get the arp executable path 
      $location = `which arp`; 
      // Execute the arp command and store the output in $arpTable 
      $arpTable = `$location`; 
      // Split the output so every line is an entry of the $arpSplitted array 
      $arpSplitted = split("\n",$arpTable); 
      // Get the remote ip address (the ip address of the client, the browser) 
      $remoteIp = $GLOBALS['REMOTE_ADDR']; 
      // Cicle the array to find the match with the remote ip address 
      foreach ($arpSplitted as $value) { 
            // Split every arp line, this is done in case the format of the arp 
            // command output is a bit different than expected 
            $valueSplitted = split(" ",$value); 
            foreach ($valueSplitted as $spLine) { 
                  if (preg_match("/$remoteIp/",$spLine)) { 
                        $ipFound = true; 
                  } 
                  // The ip address has been found, now rescan all the string 
                  // to get the mac address 
                  if ($ipFound) { 
                        // Rescan all the string, in case the mac address, in the string 
                        // returned by arp, comes before the ip address 
                        // (you know, Murphy's laws) 
                        reset($valueSplitted); 
                        foreach ($valueSplitted as $spLine) { 
                              if (preg_match("/[0-9a-f][0-9a-f][:-]". 
                                                       "[0-9a-f][0-9a-f][:-]". 
                                                       "[0-9a-f][0-9a-f][:-]". 
                                                       "[0-9a-f][0-9a-f][:-]". 
                                                       "[0-9a-f][0-9a-f][:-]". 
                                                       "[0-9a-f][0-9a-f]/i",$spLine)) { 
                                    return $spLine; 
                              } 
                        } 
                  } 

                  $ipFound = false; 
            } 
      } 
      return false; 
} 
 
Post Reply

Return to “PHP & MySQL”