Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1632805
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: IT职场

2012-07-23 10:59:32

有个问题困扰了好久了,如何处理网站访问者的身份呢?IP吗?如果用户改IP呢?后来想到了用户电脑的MAC地址是唯一的,OK想办法拿到用户MAC地址 问题就解决了。但是怎么拿又是个问题,全网上查 了下,发现一个拿自己MAC的方法,但是不是我们要的结果啊,肿么办?DT的问了老师,他说PHP不能获取到MAC地址,当时好伤心啊。后来想想或许大神 是真不知道吧。但是,关荣的遇上了强哥(李强强老师),强哥V5啊!在强哥的课堂是一不小心学到了一个关于操作MAC的函数,太happy了,灵感来 了!arp -a (linux上是直接用arp 就行) 只要用户登录你的网站就会建立通信,然后他的MAC就存到你的arp列表中。在php上使用exec()函数可以执行DOS命令,然后把exec()执行 的结果赋值给一个数组,下图是在DOS上的结果
----------------------------------------------------------------------------------
C:\Documents and Settings\Administrator>arp -a

Interface: 192.168.100.254 --- 0x2
  Internet Address      Physical Address      Type
  192.168.100.137       00-00-00-00-00-00     invalid

Interface: 192.168.60.29 --- 0x3
  Internet Address      Physical Address      Type
  192.168.60.1          3c-e5-a6-0c-60-bb     dynamic
  192.168.60.4          00-1f-c6-e9-4c-a3     dynamic
  192.168.60.13         00-16-d3-2f-83-55     dynamic
  192.168.60.28         00-15-58-7b-72-92     dynamic
  192.168.60.100        dc-0e-a1-5f-57-a6     dynamic
  192.168.60.179        00-15-58-81-07-4e     dynamic
  192.168.60.214        00-16-41-17-f0-d1     dynamic
----------------------------------------------------------------------------------
得到这个数组后我们就可以拿到用户的mac了,这里会用到一些字符串处理函数,推荐大家使用explode(),很快就拿到自己想要的数据了,是不是很happy。
在 笔者测试的时候也发现了一些问题,需要继续完善下,这个命令在windows环境下跑的很好,但到linux下就捉襟见肘了,不过这里大体思路完成了,只 要在用户访问网站时,先判断下用户的操作系统然后对应的选择NET类中的方法就解决问题了,话说linux下用awk会比php的字符串操作函数更方便, 期待大家共同完善,和提出新的问题,共同进步!
下面附上源码。

/**
*采集访问者网络信息
*
*/
class Net{
/**
*参数列表
*
*@param string $hostMac     服务器IP配置文件的MAC信息行
*@param string $Vip         客户端IP地址
*@param string $Vmac         客户端MAC地址
*
*/

    private $hostMac=array();
    static $Vip=NULL;
    private $pos;
    static $Vmac=NULL;    
    private $Maclist=array();    

    /**
    *获取服务器的MAC地址
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组
    *@return  返回值:服务器的MAC
    */
    public function getHostMac(){
        @exec("ipconfig/all",$Tmarr);
        for($Tmpa;$Tmpa            if(eregi("Physical",$Tmarr[$Tmpa])){
                $this->hostMac=explode(":",$Tmarr[$Tmpa]);    
            }
        }
        return $this->hostMac[1];    
    }

    /**
    *获取客户端的IP地址
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组        
    *@return 返回值:客户端IP
    */
    public function getVisitIp() {
        if (self::$Vip !== NULL){
            return self::$Vip;
            }
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $Tmarr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown',$Tmarr);
            if(false !== $pos){
                unset($Tmarr[$pos]);
            }
            echo self::$Vip;
            die();
        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            self::$Vip = $_SERVER['HTTP_CLIENT_IP'];
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            self::$Vip = $_SERVER['REMOTE_ADDR'];
        }
        // IP地址合法验证
        self::$Vip = (false !== ip2long(self::$Vip)) ? self::$Vip : '0.0.0.0';
        return self::$Vip;
    }

    /**
    *获取客户端的MAC地址
    *
    *@param int $Tmpa             支持for循环的临时参数
    *@param array $Tmarr             存放列表信息的临时数组    
    *@return 返回值:客户端MAC
    */
    public function getVisitMac(){
        @exec("arp -a",$Tmarr);
        $ip=$this->getVisitIp();
        for($Tmpa;$Tmpa            if(eregi($ip,$Tmarr[$Tmpa])){
                self::$Vmac=explode(" ",$Tmarr[$Tmpa]);    
            }
        }
        return self::$Vmac[11];
    }
    public    function filter($mac,$ip){        //定义一个过滤MAC的函数 @return string $clinetMac

        $Ecar=array_shift($mac);
        while(count($mac)<>0){
            $Ecar=array_pop($mac);
            if(substr_count($Ecar,$ip)==1){
                $clientMac=trim($Ecar);
                $clientMac=str_replace($ip," ",$clientMac);
                $clientMac=str_split(trim($clientMac),17);
                return $clientMac=$clientMac[0];
            }
        }
    }
}

?>
阅读(378) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~