143

I need to know the MAC and the IP address of the connect clients, how can I do this in PHP?

hakre
  • 178,314
  • 47
  • 389
  • 754
Neveen
  • 2,005
  • 3
  • 20
  • 22
  • IP address of what? Of the client that is connected? – Palantir Sep 14 '09 at 08:48
  • 1
    Address of the server or of a visitor? – KiNgMaR Sep 14 '09 at 08:48
  • 13
    For what purpose do you want the MAC address? Are you aware it can be changed by the user? – user207421 May 13 '12 at 23:31
  • @EJP I have a use case for the MAC address. I want to serve different information based on the device that is requesting the web page. Is there another way to get unique information of the device requesting the page? – Dante May 29 '18 at 20:39

16 Answers16

198

Server IP

You can get the server IP address from $_SERVER['SERVER_ADDR'].

Server MAC address

For the MAC address, you could parse the output of netstat -ie in Linux, or ipconfig /all in Windows.

Client IP address

You can get the client IP from $_SERVER['REMOTE_ADDR']

Client MAC address

The client MAC address will not be available to you except in one special circumstance: if the client is on the same ethernet segment as the server.

So, if you are building some kind of LAN based system and your clients are on the same ethernet segment, then you could get the MAC address by parsing the output of arp -n (linux) or arp -a (windows).

Edit: you ask in comments how to get the output of an external command - one way is to use backticks, e.g.

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

But what if the client isn't on a LAN?

Well, you're out of luck unless you can have the client volunteer that information and transmit via other means.

Paul Dixon
  • 277,937
  • 48
  • 303
  • 335
  • 2
    How to get output of arp -a by using php?? – Neveen Sep 14 '09 at 12:04
  • 1
    @paulDixon hello this is a old post, and I'm wondering is there is a new way to get the Mac Address? – jcho360 Jun 21 '12 at 12:58
  • @jcho360 It's still not possible to get the MAC address of a client. I don't expect to see it happen anyway because the MAC address has no communication value and so will not be preserved in het request header. – Bearwulf Jul 03 '12 at 12:18
  • @Bearwulf thank you so much for reply back, that's what I thought, is there any way to identify unique computers connected to a site? – jcho360 Jul 03 '12 at 14:17
  • 7
    @jcho360 Personally I would use a combination of IP address + Request information and make a hash of it, for example md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']);. It definently isn't bulletproof but its a start. Another more easier and secure way is setting a cookie with a unique hash. When using that cookie everytime you are sure which user is connecting to your website. – Bearwulf Jul 05 '12 at 11:50
  • This always returns the exact same result as $_SERVER['REMOTE_ADDR']. – SISYN Jul 24 '15 at 19:20
  • I don't see the javascript suggestion you are referring to. – kasperd Oct 22 '16 at 10:59
  • The answer is 7 years old, and referenced another answer which has been deleted. I've removed the reference. – Paul Dixon Oct 26 '16 at 09:34
  • I reverified that the output MAC address is that of the server, not of the client machine. I note that the client and server machines are on the same LAN using only one (1) router. Please correct me if I misunderstood your answer. I also intend to know how to identify the MAC address of the client machine using PHP. Thank you. – masarapmabuhay Aug 21 '20 at 07:50
25

The MAC address of a client (in the sense of the computer that issued the HTTP request) is overwritten by every router between the client and the server.

Client IP is conveniently provided to the script in $_SERVER['REMOTE_ADDR']. In some scenarios, particularly if your web server is behind a proxy (i.e. a caching proxy) $_SERVER['REMOTE ADDR'] will return the IP of the proxy, and there will be an extra value, often $_SERVER['HTTP_X_FORWARDED_FOR'], that contains the IP of the original request client.

Sometimes, particularly when you're dealing with an anonymizing proxy that you don't control, the proxy won't return the real IP address, and all you can hope for is the IP address of the proxy.

Michał Tatarynowicz
  • 1,226
  • 2
  • 14
  • 31
9

I don't think you can get MAC address in PHP, but you can get IP from $_SERVER['REMOTE_ADDR'] variable.

RaYell
  • 66,181
  • 20
  • 123
  • 149
  • You can get the mac address, i think :) – Jitesh Sojitra May 17 '16 at 07:17
  • mac address is visible to only local networks, you can access mac address of any device out of its local network, for example your mac address will be stored and visible in your local wifi router, and outside of it, all device in your network will be using and will be communicated with same IP address, which router will translate back to mac address and will send it internally. – Dheeraj Thedijje Oct 16 '16 at 09:05
9

For windows server I think u can use this:

<?php
echo exec('getmac');
?>
Simos
  • 114
  • 1
  • 2
6

All you need to do is to put arp into diferrent group.

Default:

-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*

With command:

sudo chown root:www-data /usr/sbin/arp

you will get:

-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*

And because apache is a daemon running under the user www-data, it's now able to execute this command.

So if you now use a PHP script, e.g.:

<?php
$mac = system('arp -an');
echo $mac;
?>

you will get the output of linux arp -an command.

cosmin
  • 20,422
  • 5
  • 39
  • 57
McJ
  • 71
  • 1
  • 1
2

Use this class (https://github.com/BlakeGardner/php-mac-address)

This is a PHP class for MAC address manipulation on top of Unix, Linux and Mac OS X operating systems. it was primarily written to help with spoofing for wireless security audits.

Ali
  • 4,523
  • 3
  • 22
  • 38
2

You can get MAC Address or Physical Address using this code

$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));  
$d1 = explode(':',$d[1]);  
$d2 = explode(' ',$d1[1]);  
return $d2[1];

I used explode many time because shell_exec ("ipconfig/all") return complete detail of all network. so you have to split one by one. when you run this code then you will get
your MAC Address 00-##-##-CV-12 //this is fake address for show only.

Arjun Ram pul
  • 135
  • 1
  • 11
1

In windows, If the user is using your script locally, it will be very 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); 
?>
Mirtov
  • 77
  • 11
1

You can use the following solution to solve your problem:

$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;
Grant Miller
  • 19,410
  • 15
  • 108
  • 135
0

We can get MAC address in Ubuntu by this ways in php

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

Getting MAC Address Using PHP: (Tested in Ubuntu 18.04) - 2020 Update

Here's the Code:

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

Output:

{
    "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"
}
Smack Alpha
  • 1,119
  • 9
  • 26
-1
// 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;  

This works for me on Windows, as ipconfig /all is Windows system command.

Casimir Crystal
  • 18,651
  • 14
  • 55
  • 76
Ashwin
  • 414
  • 1
  • 6
  • 16
  • 5
    If this answer teaches you anything, it would hopefully be not to copy/paste code you do not understand. It does not do what the OP asked. – tripleee Nov 26 '15 at 13:15
-1

Perhaps getting the Mac address is not the best approach for verifying a client's machine over the internet. Consider using a token instead which is stored in the client's browser by an administrator's login.

Therefore the client can only have this token if the administrator grants it to them through their browser. If the token is not present or valid then the client's machine is invalid.

-1

too late to answer but here is my approach since no one mentioned this here:
why note a client side solution ?
a javascript implementation to store the mac in a cookie (you can encrypt it before that)
then each request must include that cookie name, else it will be rejected.
to make this even more fun you can make a server side verification
from the mac address you get the manifacturer (there are plenty of free APIs for this)
then compare it with the user_agent value to see if there was some sort of manipulation:
a mac address of HP + a user agent of Safari = reject request.

Amine
  • 165
  • 1
  • 5
  • 19
-2

under linux using iptables you can log to a file each request to web server with mac address and ip. from php lookup last item with ip address and get mac address.

As stated remember that the mac address is from last router on the trace.

TexWiller
  • 178
  • 1
  • 9
-4

You can do this easily using openWRT. If yo use a captive portal you can mix php and openWRT and make a relation between the IP and the mac.

You can write a simple PHP code using:

 $localIP = getHostByName(getHostName()); 

Later, using openWRT you can go to /tmp/dhcp.leases, you will get something with the form:

 e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX 

There, you have the mac, the IP address and the hostname.