如何在 PHP 中获得连接的客户机的 MAC 和 IP 地址?

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

474408 次浏览

服务器 IP 地址

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

服务器 MAC 地址

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

客户端 IP 地址

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

客户端 MAC 地址

客户端 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];
}
}

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

除非你能让客户自愿提供信息并通过其他方式传输否则你就不走运了。

我不认为你可以在 PHP 中获得 MAC 地址,但你可以从 $_SERVER['REMOTE_ADDR']变量获得 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命令的输出。

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

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

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

使用本课程( https://github.com/blakegardner/php-mac-address )

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

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

在 linux 下使用 iptables 你可以通过 mac 地址和 ip 登录到一个文件,每个请求都可以发送到 web 服务器。 从 php 查找最后一项与 IP 地址,并得到 Mac 地址。

如上所述,请记住,Mac 地址是从最后一个路由器上的跟踪。

对于 windows server,我认为你可以这样做:

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

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

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

您可以使用此代码获得 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 地址 简历12//这是假地址,仅供参考。

你可以使用以下方法解决你的问题:

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

我们可以通过 php 获得 Ubuntu 中的 MAC 地址

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

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

也许获取 Mac 地址并不是通过互联网验证客户机的最佳方法。考虑使用一个由管理员的登录名存储在客户机浏览器中的令牌。

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

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

这个适合我:

<?php
  

// PHP code to get the MAC address of Server
$MAC = exec('getmac');
  

// Storing 'getmac' value in $MAC
$MAC = strtok($MAC, ' ');
  

// Updating $MAC value using strtok function,
// strtok is used to split the string into tokens
// split character of strtok is defined as a space
// because getmac returns transport name after
// MAC address
echo "MAC address of Server is: $MAC";
?>

资料来源: https://www.geeksforgeeks.org/how-to-get-the-mac-and-ip-address-of-a-connected-client-in-php/