我怎样才能获得在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系统命令。