我怎样才能获得在PHP连接的客户端的MAC和IP地址?

我需要知道连接客户端的MAC和IP地址,我怎样才能在PHP中做到这一点?

服务器IP

您可以从$_SERVER['SERVER_ADDR']获取服务器IP地址。

服务器MAC地址

对于MAC地址,可以在Linux中parsingnetstat -ie的输出,或者在Windows中parsingipconfig /all

客户端IP地址

您可以从$_SERVER['REMOTE_ADDR']获取客户端IP

客户端MAC地址

除了在特殊情况下,客户端MAC地址将不可用: 如果客户端与服务器在同一个以太网段上。

因此,如果您正在构build某种基于局域网的系统,并且您的客户端位于同一个以太网段,则可以通过parsingarp -n (linux)或arp -a (windows)的输出来获取MAC地址。

编辑 :你问在评论如何获得外部命令的输出 – 一种方法是使用反引号,例如

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

但是如果客户端不在局域网上呢?

那么,除非你能让客户自愿通过其他方式传递这些信息,否则你是不幸的。

客户端的MAC地址(在发出HTTP请求的计算机的意义上)被客户端和服务器之间的每个路由器覆盖。

客户端IP可方便地通过$_SERVER['REMOTE_ADDR']提供给脚本。 在一些情况下,特别是如果你的web服务器在代理(即一个caching代理)后面, $_SERVER['REMOTE ADDR']将返回代理的IP,并且会有额外的值,通常是$_SERVER['HTTP_X_FORWARDED_FOR'] ,其中包含原始请求客户端的IP。

有时候,特别是当你正在处理一个你不能控制的匿名代理时,代理将不会返回真实的IP地址,你所希望的只是代理的IP地址。

我不认为你可以在PHP中获得MAC地址,但是你可以从$_SERVER['REMOTE_ADDR']variables获得IP。

所有你需要做的就是把arp放到不同的组中。

默认:

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

用命令:

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

你会得到:

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

而且由于apache是​​一个运行在用户www-data下的守护进程,现在可以执行这个命令。

所以,如果你现在使用PHP脚本,例如:

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

你会得到linux arp -an命令的输出。

对于Windows服务器,我认为你可以使用这个:

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

在Windows中,如果用户在本地使用脚本,将会非常简单:

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

使用这个类(https://github.com/BlakeGardner/php-mac-address);

这是一个用于在Unix,Linux和Mac OS X操作系统之上进行MAC地址操作的PHP类。 它主要是为了帮助进行无线安全审计。

在Linux下使用iptables你可以logging每个请求到web服务器的文件与mac地址和ip。 从PHP查找最后一项与IP地址,并获得MAC地址。

如上所述,请记住,该mac地址来自trace上的最后一个路由器。

你可以使用openWRT轻松地做到这一点。 如果您使用强制门户,您可以混合使用php和openWRT,并在IP和mac之间build立关系。

你可以写一个简单的PHP代码使用:

  $localIP = getHostByName(getHostName()); 

后来,使用openWRT你可以去/tmp/dhcp.leases ,你会得到一些forms:

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

在那里,你有mac,IP地址和主机名。

  //get user real ip function kh_getUserIP(){ $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = $_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)){ $ip = $client; }elseif(filter_var($forward, FILTER_VALIDATE_IP)){ $ip = $forward; }else{ $ip = $remote; } return $ip; } 
 // 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; 

这在Windows上适用于我,因为ipconfig /all是Windows系统命令。