欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-12 11:45:33
复制代码 代码如下: function ce_getmac() { if(php_os == 'winnt') { $return_array = array(); $te...
复制代码 代码如下:

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使用的代理(有可能存在,也可以伪造)