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

代码如下:

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

(0)

相关推荐

  • PHP执行linux系统命令的常用函数使用说明

    system函数 说明:执行外部程序并显示输出资料. 语法:string system(string command, int [return_var]); 返回值: 字符串 详细介绍: 本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果.若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中.同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用 EscapeShellCmd().若 PHP 以

  • php $_SERVER windows系统与linux系统下的区别说明

    这是我在做企业站的过程中发现的一些区别:(仅供参考) 一.$_SERVER['SERVER_NAME']  在windows系统下,末尾是有 / 的,linux下没有/ . 可用以下方法处理 1.不论是那种系统直接全部加上 / 然后在进行替换 ,切记 ,应如此替换 str_replace('\\', '/', $fileUrl); 才可以. 2.判断是那种操作系统,使用PHP_OS,然后进行字符截取进行判断.

  • php获取网卡的MAC地址支持WIN/LINUX系统

    复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; function GetMacAddr($os_type){ switch ( strtolower($os_type) ){ case "linux": $this->for

  • linux系统上支持php的 iconv()函数的方法

    1.下载libiconv函数库http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz: 2.解压缩tar -zxvf libiconv-1.9.2.tar.gz; 3.安装libiconv 复制代码 代码如下: #configure --prefix=/usr/local/iconv #make #make install 4.重新编译php 增加编译参数--with-iconv=/usr/local/iconv windows下 最近

  • php获取服务器端mac和客户端mac的地址支持WIN/LINUX

    获取服务器mac 复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetmacAddr{ var $result = array(); // 返回带有MAC地址的字串数组 var $macAddr; /*构造*/ function __construct($osType){ switch ( strtolower($osType) ){ case "unix": break;

  • Linux系统下php获得系统分区信息的方法

    本文实例讲述了Linux系统下php获得系统分区信息的方法.分享给大家供大家参考.具体实现方法如下: $pars = array_filter(explode("\n",`df -h`)); foreach ($pars as $par) { if ($par{0} == '/') { $_tmp = array_values(array_filter(explode(' ',$par))); reset($_tmp); echo "分区挂载点:{$_tmp['5']},&q

  • 分享一段php获取linux服务器状态的代码

    简单的php获取linux服务器状态的代码,不多说-直接上函数: 复制代码 代码如下: function get_used_status(){  $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"',"r");//获取某一时刻系统cpu和内存使用情况  $rs = "";  while(!feof($fp)){   $rs .= fread($fp,1024);  }  pclose($fp

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

    复制代码 代码如下: 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&

  • Java实现获取内网的所有IP地址

    目录 题目描述 代码详解 效果展示 题目描述 在进行网络编程时,有时需要对局域网的所有主机进行遍历,为此需要获得内网的所以IP地址 题目实现:获得内网的所有IP地址的小应用. 解题思路 创建一个类:GainAlllpFrame,继承JFrame窗体类 定义一个gainAlllp()方法:用于获得所有IP,并显示在文本域中的方法 定义一个内部类Pinglp Thread,且是线程类.用于判断给定IP是否为内网IP的线程对象 线程类的执行逻辑是对指定的IP进行ping 访问 获得本机的IP地址和网段

  • python通过scapy获取局域网所有主机mac地址示例

    python通过scapy获取局域网所有主机mac地址 复制代码 代码如下: #!/usr/bin/env python# -*- coding: utf-8 -*-from scapy.all import srp,Ether,ARP,confipscan='192.168.1.1/24'try:    ans,unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),timeout=2,verbose=False)exc

  • 详解Spring Security中获取当前登录用户的详细信息的几种方法

    目录 在Bean中获取用户信息 在Controller中获取用户信息 通过 Interface 获取用户信息 在JSP页面中获取用户信息 在Bean中获取用户信息 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentU

  • JScript中调用ActiveX获取访客网卡MAC地址实现代码

    JScript调用activeXObject获取访客的网卡MAC地址,注意只能IE下运行(IE8+没测试),会有安全提示,提示如下: 复制代码 代码如下: 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全.你想允许这种交互吗? 注意选择"是",要不报错无法获取: 源代码如下: <html> <head> <title>JScript+ActiveX获取访客MAC网卡地址</title> </head> <b

  • java中获取当前服务器的Ip地址的方法

    1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root值访问,也可以通过http://127.0.0.1/项目root值访问. 如果部署在服务器(linux)系统类,则需要通过服务器的Ip地址进行访问. 2.下面说说怎么获取Ip地址: 获取本地的Ip地址: public static void main(String[] args) { try { I

  • Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码

    /** * @author hechen */ var gs = { /**获得屏幕宽度**/ ScreenWidth: function () { return window.screen.width; }, /***获得屏幕高度**/ ScreenHeight: function () { return window.screen.height; }, /**获得浏览器***/ Browse: function () { var browser = {}; var userAgent = n

  • js与jquery中获取当前鼠标的x、y坐标位置的代码

    复制代码 代码如下: <div id="testDiv">放在我上面</div> <script type="text/javascript"> $('#testDiv').mousemove(function(e) { var xx = e.originalEvent.x || e.originalEvent.layerX || 0; var yy = e.originalEvent.y || e.originalEvent.l

  • asp.Net 中获取一周第一天,一月第一天等实现代码

    复制代码 代码如下: DateTime dt = DateTime.Now; //本月第一天时间 DateTime dt_First = dt.AddDays(-(dt.Day) + 1); Label1.Text = dt_First.ToString("yyyy-MM-dd"); //将本月月数+1 DateTime dt2 = dt.AddMonths(1); //本月最后一天时间 DateTime dt_Last = dt2.AddDays(-(dt.Day)); Label2

  • C#获得MAC地址(网卡序列号)的实现代码

    代码如下: 复制代码 代码如下: //获得网卡序列号    public string GetMoAddress()    {        string MoAddress = " ";        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");        ManagementObjectCollection moc2 = mc.GetInstanc

随机推荐