Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中获取已连接客户端的MAC和IP地址?_Php_Mac Address - Fatal编程技术网

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

如何在PHP中获取已连接客户端的MAC和IP地址?,php,mac-address,Php,Mac Address,我需要知道connect客户端的MAC和IP地址,如何在PHP中做到这一点?服务器IP 您可以从$\u server['server\u ADDR']获取服务器IP地址 服务器MAC地址 对于MAC地址,您可以在Linux中解析netstat-ie的输出,或者在Windows中解析ipconfig/all 客户端IP地址 您可以从$\u服务器['REMOTE\u ADDR'] 客户端MAC地址 客户机MAC地址将不可用,除非在一种特殊情况下:如果客户机与服务器位于同一以太网段上 因此,如果您正在

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

服务器IP 您可以从
$\u server['server\u ADDR']
获取服务器IP地址

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

客户端IP地址 您可以从
$\u服务器['REMOTE\u ADDR']

客户端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地址,但您可以从
$\u服务器['REMOTE\u 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数据下运行的守护程序,因此它现在能够执行此命令

因此,如果您现在使用PHP脚本,例如:

<?php
$mac = system('arp -an');
echo $mac;
?>


您将获得linux
arp的输出-一个
命令。

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

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

有时,特别是当你处理一个你无法控制的匿名代理时,代理不会返回真实的IP地址,你所希望的只是代理的IP地址。

这是一个PHP类,用于Unix、Linux和MAC OS X操作系统上的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.leaves
,您将获得以下表单:

 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];
我多次使用explode,因为shell\u exec(“ipconfig/all”)返回所有网络的完整细节。所以你必须一个一个分开。 当您运行此代码时,您将获得

您的MAC地址00-##-##-##-CV-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
?>

也许获取Mac地址不是通过internet验证客户机的最佳方法。考虑使用令牌,而不是通过管理员登录来存储在客户端的浏览器中。p>
因此,只有管理员通过其浏览器将此令牌授予客户端时,客户端才能拥有此令牌。如果令牌不存在或无效,则客户端的计算机无效。

回答太迟,但以下是我的方法,因为这里没有人提到这一点:
为什么要注意客户端解决方案?
将mac存储在cookie中的javascript实现(在此之前可以对其进行加密)
然后每个请求必须包含该cookie名称,否则将被拒绝。
为了使这更有趣,您可以进行服务器端验证
从mac地址可以获得manifacturer(有很多免费API)
然后将其与user_agent值进行比较,查看是否存在某种操纵:

HP的mac地址+Safari的用户代理=拒绝请求。

什么的IP地址?连接的客户端的地址?服务器或访问者的地址?您希望MAC地址用于什么目的?你知道用户可以更改它吗?@EJP我有一个MAC地址的用例。我想根据请求网页的设备提供不同的信息。有没有其他方法可以获取请求页面的设备的唯一信息?如何使用php获取arp-a的输出???@paulDixon您好这是一篇老文章,我想知道是否有新方法可以获取Mac地址?@jcho360仍然无法获取客户端的Mac地址。我不希望看到这种情况发生,因为MAC地址没有通信价值,因此不会保存在het请求头中。@Bearwulf非常感谢您的回复
{
    "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"
}