服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码

PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码

2019-12-10 13:33PHP代码网 PHP教程

做一个内网根据MAC地址自动登录的应用,在WINDOW 2003可以正常使用,函数如下

代码如下:


function ce_getmac() 

if(PHP_OS == 'WINNT') 

$return_array = array(); 
$temp_array = array(); 
$mac_addr = ""; 
@exec("arp -a",$return_array); 
foreach($return_array as $value) 

if(strpos($value,$_SERVER["HTTP_CLIENT_IP"]) !== false && 
preg_match("/(:?[0-9a-f]{2}[:-]){5}[0-9a-f]{2}/i",$value,$temp_array)) 

$mac_addr = $temp_array[0]; 
break; 


return $mac_addr ? strtoupper($mac_addr) : ''; 

else if(PHP_OS == 'Linux') 

return true; 


函数已经修改过了,到LINUX上发现不能使用EXEC函数,也就是获取不到MAC地址了。经过沟通,该项目必须部署在LINUX服务器下,笔者经过苦思冥想了半天终于找到了一个解决方案,不用执行EXEC也可以获取到内网用户的MAC地址。 
在内网服务器中,有一台192.168.1.151的服务器,服务器上一个API,访问这个API,就获取用户MAC,JOSN的方式输出用户账号信息,因为该服务器可以获取MAC,就可以稍加利用了。 
使用CURL伪造来源IP方式(IP不是LINUX服务器的IP,是客户端访问的IP地址),CURL到151服务器,服务器得到相应,根据用户IP地址 和ARP -A 参数的正则方式就可以得到客户端的MAC地址,程序运行在151,而151是WINDOWS 2008服务器。但是要注意的是不能使用REMOTE_ADDR,必须使用HTTP_CLIENT_IP。 原因是HTTP_CLIENT_IP可以使用CURL伪造,这样就可以使用LINUX获取用户IP,然后传送给151处理。 
疑问:根据用户IP获取MAC地址,那用户换一个IP了怎么办呢?使用CMD下 ARP -A分析,即使用户跟换IP,但是对应该用户的这台计算机的MAC地址默认是不会更换的。 

下面是摘抄网友的关于获取IP的文章: 
dz的代码判断IP那块太让人头疼了,日,REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR三个东西在手册上太不详细了,基本上就等于没有。 
网上gg了一下,找到一点,另外,有一个思路太巧了,用JS取IP以后POST到服务器,Y的用代理骗服务器?有种上网先把Js给关了啊!!哦哈哈,以后有机会用ajax试一下,也省得用这三个变量if得死去活来了。 

$_SERVER['...']; // for php 
一、没有使用代理服务器的情况: 
REMOTE_ADDR = 您的 IP 
HTTP_VIA = 没数值或不显示 
HTTP_X_FORWARDED_FOR = 没数值或不显示 
二、使用透明代理服务器的情况:Transparent Proxies 
REMOTE_ADDR = 最后一个代理服务器 IP 
HTTP_VIA = 代理服务器 IP 
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。 
三、使用普通匿名代理服务器的情况:Anonymous Proxies 
REMOTE_ADDR = 最后一个代理服务器 IP 
HTTP_VIA = 代理服务器 IP 
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。 
四、使用欺骗性代理服务器的情况:Distorting Proxies 
REMOTE_ADDR = 代理服务器 IP 
HTTP_VIA = 代理服务器 IP 
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。 
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies) 
REMOTE_ADDR = 代理服务器 IP 
HTTP_VIA = 没数值或不显示 
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。 

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。 
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。 
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP 
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造) 
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

延伸 · 阅读

精彩推荐