我需要在PHP中获取连接客户端的MAC地址和IP地址,有什么方法可以做到这一点?
我需要在PHP中获取连接客户端的MAC地址和IP地址,有什么方法可以做到这一点?
您可以从$_SERVER['SERVER_ADDR']
获取服务器IP地址。
对于MAC地址,在Linux中,您可以解析netstat -ie
的输出,在Windows中,您可以解析ipconfig /all
的输出。
您可以从$_SERVER['REMOTE_ADDR']
获取客户端IP地址。
除非客户端和服务器在同一个以太网段上,否则您将无法获取客户端MAC地址。
因此,如果您正在构建基于局域网的系统,并且您的客户端在同一个以太网段上,那么您可以通过解析arp -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];
}
}
好吧,除非你能让客户端自愿提供这些信息并通过其他方式传输,否则你将没有任何运气。
每个路由器在客户端和服务器之间都会覆盖客户端(指发出HTTP请求的计算机)的MAC地址。
客户端IP可以方便地通过$_SERVER['REMOTE_ADDR']
提供给脚本。在某些情况下,特别是当您的Web服务器位于代理(即缓存代理)后面时,$_SERVER['REMOTE ADDR']
将返回代理的IP,并且通常会有一个额外的值$_SERVER['HTTP_X_FORWARDED_FOR']
,其中包含原始请求客户端的IP。
有时,特别是当您正在处理无法控制的匿名代理时,代理将不返回真实的IP地址,而您所能得到的只是代理的IP地址。
对于Windows Server,我认为您可以使用以下方法:
<?php
echo exec('getmac');
?>
我认为在PHP中无法获取MAC地址,但是可以从$_SERVER['REMOTE_ADDR']
变量中获取IP地址。
-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
命令的输出结果。
arp
二进制文件的组是多余的,www-data
仍然从 other
umode 中拥有执行权限。 - deed02392<?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类。它主要是为了帮助无线安全审计中的欺骗而编写的。
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
回答晚了,但这是我的方法,因为没有人在这里提到:
为什么不采用客户端解决方案?
使用JavaScript实现将MAC地址存储在Cookie中(您可以在此之前对其进行加密)
然后每个请求都必须包含该Cookie名称,否则它将被拒绝。
为了使这更有趣,您可以进行服务器端验证
从MAC地址中获取制造商(有很多免费的API可用于此)
然后将其与user_agent值进行比较,以查看是否存在某种操作:
HP的MAC地址+ Safari的用户代理=拒绝请求。
$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;