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

Posted

技术标签:

【中文标题】如何在 PHP 中获取已连接客户端的 MAC 和 IP 地址?【英文标题】:How can I get the MAC and the IP address of a connected client in PHP? 【发布时间】:2010-11-28 01:39:11 【问题描述】:

我需要知道连接客户端的 MAC 和 IP 地址,我如何在 php 中做到这一点?

【问题讨论】:

IP地址是什么?连接的客户端? 服务器地址还是访问者地址? 您想要 MAC 地址的目的是什么?您知道它可以由用户更改吗? @EJP 我有一个 MAC 地址的用例。我想根据请求网页的设备提供不同的信息。还有其他方法可以获取请求页面的设备的唯一信息吗? 【参考方案1】:

服务器 IP

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

服务器 MAC 地址

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

客户端 IP 地址

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

客户端 MAC 地址

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

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

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

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

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

好吧,除非您可以让客户自愿提供该信息并通过其他方式传输,否则您会很不走运。

【讨论】:

如何使用php获取arp -a的输出?? @paulDixon 你好,这是一个旧帖子,我想知道是否有一种新的方法来获取 Mac 地址? @jcho360 仍然无法获取客户端的 MAC 地址。我不希望看到它发生,因为 MAC 地址没有通信价值,因此不会保留在 het 请求标头中。 @Bearwulf 非常感谢您的回复,这就是我的想法,有没有办法识别连接到站点的唯一计算机? @jcho360 我个人会使用 IP 地址 + 请求信息的组合并对其进行哈希处理,例如 md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); .它绝对不是防弹的,但它是一个开始。另一种更简单、更安全的方法是设置具有唯一哈希的 cookie。每次使用该 cookie 时,您都可以确定哪个用户正在连接到您的网站。【参考方案2】:

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

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

有时,特别是当您处理不受您控制的匿名代理时,代理不会返回真实的 IP 地址,而您所希望的只是代理的 IP 地址。

【讨论】:

【参考方案3】:

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

【讨论】:

mac地址仅对本地网络可见,您可以访问本地网络之外的任何设备的mac地址,例如您的mac地址将被存储并在您的本地wifi路由器中可见,并且在外部它,您网络中的所有设备都将使用并使用相同的 IP 地址进行通信,该路由器将转换回 MAC 地址并在内部发送。【参考方案4】:

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

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

【讨论】:

它只在 LAN 上工作,但这个显示所有 mac 地址 还有windows10。此外,您不必使用 exec 只需 `echo getmac【参考方案5】:

您只需将 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 命令的输出。

【讨论】:

这只会为您提供本地网络上设备的 MAC 地址。 更改arp 二进制文件的组是多余的,www-data 仍然具有来自other umode 的执行权限。【参考方案6】:

您可以使用此代码获取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 //这是假地址,仅供展示。

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:
// 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 系统命令。

【讨论】:

如果这个答案教会了你什么,希望不要复制/粘贴你不理解的代码。它没有按照 OP 的要求做。【参考方案11】:

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

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

【讨论】:

【参考方案12】:

使用 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"

【讨论】:

【参考方案13】:

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

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

【讨论】:

【参考方案14】:

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

【讨论】:

我喜欢基于 javascript 的解决方案的想法。你能提供一个代码中的例子吗?我在搜索中看到的大多数内容都表明您不能。【参考方案15】:

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

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

【讨论】:

【参考方案16】:

您可以使用 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 地址和主机名。

【讨论】:

以上是关于如何在 PHP 中获取已连接客户端的 MAC 和 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

Android如何获取到连接的WIFI无线路由器的所有客户端的MAC地址?

如何获取客户端的MAC地址

winsock2:服务器端代码调用`accept()`后如何获取已连接客户端的ipv4/ipv6地址

php socket 获取客户端ip地址

无法在我的服务器上获取已连接客户端的公共 IP

php怎样获取客户端电脑物理地址