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


136

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


IP地址是什么?的客户端是连接的吗?
Palantir

1
服务器或访客的地址?
KiNgMaR

13
您想要MAC地址有什么用途?您知道用户可以更改它吗?
罗恩侯爵

@EJP我有一个MAC地址用例。我想根据请求网页的设备提供不同的信息。还有另一种方法来获取请求页面的设备的唯一信息吗?
但丁

Answers:


186

服务器IP

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

服务器MAC地址

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

客户端IP地址

您可以从以下位置获取客户端IP $_SERVER['REMOTE_ADDR']

客户端MAC地址

除非在一种特殊情况下,否则客户端MAC地址将不可用:如果客户端与服务器位于同一以太网段中。

所以,如果你正在构建某种基于局域网的系统和你的客户在同一个以太网段,那么你可以通过解析的输出中获得的MAC地址arp -n(Linux)或arp -a(窗口)。

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

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

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

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


2
如何使用php获取arp -a的输出?
Neveen

1
@paulDixon你好,这是一篇旧文章,我想知道是否有一种获取Mac地址的新方法?
jcho360 2012年

@ jcho360仍然无法获得客户端的MAC地址。我不希望看到它发生,因为MAC地址没有通信值,因此不会保留在het请求标头中。
Bearwulf

@Bearwulf非常感谢您的回复,这就是我的想法,有没有办法识别连接到站点的唯一计算机?
jcho360

6
@ jcho360就我个人而言,我将使用IP地址+请求信息的组合并对其进行哈希处理,例如md5($ _ SERVER ['REMOTE_ADDR']。$ _SERVER ['HTTP_USER_AGENT']);。它绝对不是防弹,而是一个开始。另一种更简单和安全的方法是设置具有唯一哈希的cookie。每次使用该cookie时,您都要确定哪个用户正在连接到您的网站。
Bearwulf

24

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

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

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


9

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


我认为您可以获取mac地址:)
Jitesh Sojitra

mac地址仅对本地网络可见,您可以访问其本地网络之外的任何设备的mac地址,例如,您的mac地址将被存储并在本地wifi路由器中可见,而在其外部,网络中的所有设备将正在使用并且将使用相同的IP地址进行通信,该路由器会将其转换回mac地址并在内部发送。
Dheeraj Thedijje

7

对于Windows Server,我认为您可以使用:

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

2
<?php echo exec('getmac'); ?>仅在LAN上有效,但这显示了所有mac地址<php system('getmac');。?>
Giorgi Gogitidze

还有Windows10。另外,您不必只使用exec`echogetmac
SaidbakR

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命令的输出。


6
这样只会为您提供本地网络上设备的MAC地址。
duskwuff -inactive- 2011年

1
更改arp二进制文件的组是多余的,www-data但仍具有otherumode的执行权限。
deed02392 2014年


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

0

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

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

0

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

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

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

0

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

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


-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 //这是假的地址,只显示。


-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 /allWindows系统命令都适用于Windows 。


5
如果此答案可以教您什么,则希望不要复制/粘贴您不了解的代码。它不执行OP的要求。
2015年

-2

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

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


-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地址和主机名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.