如何在PHP中获取已连接客户端的MAC和IP地址?

时间:2009-09-14 08:43:33

标签: php mac-address

我需要知道连接客户端的MAC和IP地址,我该如何在PHP中执行此操作?

16 个答案:

答案 0 :(得分:173)

服务器IP

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

服务器MAC地址

对于MAC地址,您可以解析Linux中的netstat -ie或Windows中的ipconfig /all的输出。

客户端IP地址

您可以从$_SERVER['REMOTE_ADDR']

获取客户端IP

客户端MAC地址

除非在一个特殊情况下,否则客户端MAC地址将无法使用:如果客户端与服务器位于同一以太网网段上。

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

编辑:您在评论中询问如何获取外部命令的输出 - 一种方法是使用反引号,例如

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

但是如果客户端不在局域网上怎么办?

嗯,除非你能让客户自愿提供这些信息并通过其他方式传输,否则你运气不好。

答案 1 :(得分:22)

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

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

有时,特别是在您处理您无法控制的匿名代理时,代理将不会返回真实的IP地址,您可以希望的只是代理的IP地址。

答案 2 :(得分:8)

我认为您不能在PHP中获取MAC地址,但您可以从$_SERVER['REMOTE_ADDR']变量获取IP。

答案 3 :(得分:6)

您需要做的就是将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命令的输出。

答案 4 :(得分:6)

对于Windows服务器,我想你可以使用它:

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

我们可以在php中通过这种方式在Ubuntu中获取MAC地址

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

答案 8 :(得分:0)

使用PHP获取MAC地址:(在Ubuntu 18.04中测试)-2020更新

这是代码:

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

输出:

{
    "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"
}

答案 9 :(得分:0)

也许获取Mac地址不是通过Internet验证客户端计算机的最佳方法。考虑使用令牌代替,该令牌通过管理员的登录信息存储在客户端的浏览器中。

因此,如果管理员通过浏览器将令牌授予客户端,则客户端只能拥有该令牌。如果令牌不存在或无效,则客户端的计算机无效。

答案 10 :(得分:0)

来不及回答,但是这是我的方法,因为这里没有人提及:
为什么要记下客户端解决方案?
一个将Mac存储在cookie中的javascript实现(您可以在此之前对其进行加密)
那么每个请求都必须包含该Cookie名称,否则它将被拒绝。
要使它变得更加有趣,您可以进行服务器端验证
从mac地址中获得manifacturer(为此有很多免费的API)
然后将其与user_agent值进行比较,以查看是否存在某种操作:
HP的Mac地址+ Safari的用户代理=拒绝请求。

答案 11 :(得分:-1)

您可以使用此代码获取 MAC 地址或物理地址

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

我使用了很多次爆炸,因为 shell_exec(“ipconfig / all”)会返回所有网络的完整详细信息。所以你必须逐个拆分。 当你运行这个代码然后你会得到
您的 MAC地址 00 - ## - ## - CV-12 //这是仅供展示的虚假地址。

答案 12 :(得分:-1)

您可以使用以下解决方案来解决您的问题:

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

答案 13 :(得分:-2)

// 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系统命令。

答案 14 :(得分:-2)

在linux下使用iptables你可以使用mac地址和ip登录到web服务器的每个请求的文件。 从php查找带有ip地址的最后一项并获取mac地址。

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

答案 15 :(得分:-4)

您可以使用openWRT轻松完成此操作。如果您使用强制网络门户,您可以混合使用php和openWRT,并在IP和Mac之间建立关系。

您可以使用以下方法编写简单的PHP代码:

 $localIP = getHostByName(getHostName()); 

稍后,使用openWRT,您可以转到/tmp/dhcp.leases,您将获得以下表单:

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

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