我需要知道连接客户端的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)或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];
   }
}


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

评论


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

–内芬
09-09-14 at 12:04

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

– jcho360
2012年6月21日12:58

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

– Bearwulf
2012年7月3日,12:18

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

– jcho360
2012年7月3日14:17

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

– Bearwulf
2012年7月5日在11:50



#2 楼

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

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

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

#3 楼

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

评论


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

– Jitesh Sojitra
16年5月17日在7:17

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

– Dheeraj Thedijje
16-10-16在9:05

#4 楼

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

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


评论


<?php echo exec('getmac'); ?>仅在LAN上有效,但是此命令显示所有mac地址

– Giorgi Gogitidze
17年1月11日,12:50



还有Windows10。此外,您不必只使用exec`echo getmac

–SaidbakR
17年4月18日在0:12

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

评论


这样只会为您提供本地网络上设备的MAC地址。

– duskwuff-非活动状态-
2011年8月17日下午5:11

更改arp二进制文件的组是多余的,www数据仍然具有其他umode的执行权限。

–deed02392
2014年3月6日13:36



#6 楼

使用此类(https://github.com/BlakeGardner/php-mac-address)

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

#7 楼

您可以使用以下代码获取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 //这是仅用于显示的假地址。

#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 楼

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

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


#11 楼

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

代码为:

<?php
    $mac = shell_exec("ip link | awk '{print }'");
    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"
}


#12 楼

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

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

#13 楼

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

#14 楼

// 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的要求。

–tripleee
15年11月26日在13:15

#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 

IP地址和主机名。