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


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

PHP 相关文章推荐
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
Oct 23 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 PHP
php 文章调用类代码
Aug 11 #PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 #PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 #PHP
pdo中使用参数化查询sql
Aug 11 #PHP
php 广告调用类代码(支持Flash调用)
Aug 11 #PHP
php 中英文语言转换类代码
Aug 11 #PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 #PHP
You might like
php 获取本地IP代码
2013/06/23 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
记录Django开发心得
2014/07/16 Python
跟老齐学Python之list和str比较
2014/09/20 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
PyTorch中permute的用法详解
2019/12/30 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
保护环境建议书100字
2014/05/13 职场文书
中秋客户感谢信
2015/01/22 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
单位证明范文
2015/06/18 职场文书
2019财务转正述职报告
2019/06/27 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android