PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
程序员文章站
2022-09-24 17:10:55
复制代码 代码如下: 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使用的代理(有可能存在,也可以伪造)
上一篇: docker 详解设置容器防火墙
下一篇: php简单的会话类代码